2008-11-03 13 views
9

Je suis simplement intéressé par l'opinion des gens. Lors de l'utilisation des types nullables en C# quelle est la meilleure façon pratique pour tester null:Utilisation de types nullables en C#

bool isNull = (i == null); 

ou

bool isNull = !i.HasValue; 

également lors de l'affectation à un type non nul est ceci:

long? i = 1; 
long j = (long)i; 

mieux que:

long? i = 1; 
long j = i.Value; 

Répondre

12

Utilisez les formulaires spécialement conçus pour vous par l'équipe C#. Si quelqu'un objecte, dites-leur que Anders a dit que ça allait. Ce que je dis, de façon désinvolte, c'est que beaucoup de travail est allé dans l'intégration des types NULL dans C# pour vous donner une bonne expérience de programmation.

Notez que en termes de performance, les deux formes compilent jusqu'à la même IL, à savoir:

int? i = 1; 
bool isINull = i == null; 
int j = (int)i; 

finit comme ça après le compilateur C# a obtenu à lui:

int? i = 1; 
bool isINull = !i.HasValue; 
int j = i.Value; 
8

I wo Toujours utiliser la forme (i == null). Cela exprime ce que vous faites.

WRT la deuxième question, je pense que l'une ou l'autre forme est bien. Cependant, je vérifierai toujours par rapport à null en premier et prendra les mesures appropriées - peut-être envelopper cette vérification et l'action dans une méthode d'assistance (souvent, il suffit de définir une valeur par défaut).

0

Ils sont tous les deux identiques, mais j'utiliserais l'ancienne version sur les deux, car elle est plus courante dans le langage: comparaison à null et conversion en un type.

0

J'ai généralement tendance à pencher vers la première option dans les deux scénarios, car il est plus «primitif» orienté opposé à l'objet (ce qui était vraiment ce que nous voulions), mais peu importe

14

J'utilise ceci:

long? i = 1; 
...some code... 
long j = i ?? 0; 

cela signifie que, si i est nulle, que 0 sera affecté.

+1

également, si vous cherchez à affecter la valeur par défaut pour ce type de valeur (qui peut être ou ne pas être 0), vous pouvez utiliser long j = i ?? par défaut (long); –

+0

Le problème que j'ai avec la forme trhat est que tous les développeurs ne savent pas ce qui se passe immédiatement. –

+0

Très cool - je n'avais pas découvert le ?? opérateur ou "par défaut" encore. –

4

Je n'ai pas utilisé les types Nullable en pratique, mais pour la seconde, je suggèrerais d'utiliser j.GetValueOrDefault(). La documentation suggère que ce dernier lancerait une exception InvalidOperationException en cas de valeur nulle. Selon la mise en œuvre interne de l'opérateur de casting explicite pour longtemps ?, le premier pourrait aussi. Je m'en tiens à GetValueOrDefault et traite le cas null/default de manière appropriée.

1

I ont tendance à utiliser le premier sur les deux, car comme il doit être soutenu plus tard dans son cycle de vie, ceux-ci semblent plus faciles à comprendre quelle est l'intention de l'auteur original.

1

Réflecteur ouvert. HasValue est une recherche sur un indicateur booléen qui est défini lorsque la valeur est modifiée. Donc, en termes de cycles, une recherche va être plus rapide que la comparaison.

public Nullable(T value) 
{ 
    this.value = value; 
    this.hasValue = true; 
} 

private bool hasValue; 

internal T value; 

public bool HasValue 
{ 
    get 
    { 
     return this.hasValue; 
    } 
} 
+0

Avez-vous vérifié ce que compile la comparaison? Je serais surpris si le sucre syntaxique finissait comme autre chose qu'un appel à HasValue. – mackenir