Initialisation des variables nulles .NET
Quelle est la bonne façon d'initialiser une variable de type null .NET? J'ai été informé par un de mes collègues que difficile la définition d'une variable à la valeur null est un ralentissement.
int var1; //good practice
string s1; //good practice
int var2 = 0; //bad practice
string s2 = null; //bad practice
Est-ce exact?
OriginalL'auteur kofucii | 2010-08-28
Vous devez vous connecter pour publier un commentaire.
En supposant que vous avez réellement dire le par défaut de la valeur au lieu d'une null valeur, il pourrait ralentir les choses très, très légèrement si vous avez réellement affecter la valeur dans le constructeur au lieu de dans la déclaration de la variable. Si c'est la partie de la déclaration de la variable, je voudrais probablement attendre le compilateur JIT pour supprimer l'inutile affectation, que l'objet de la mémoire est effacé sur la première initialisation.
Cependant, les chances que cela sont significatifs sont absolument minuscule dans les deux cas.
Qui ne vous de trouver la forme plus lisible? C'est beaucoup de plus en plus important dans la grande majorité des cas.
EDIT: à Noter que pour les champs statiques au moins, il y a de subtiles cas où les deux ne se comportent pas de la même manière. Voici un exemple - le Test1 et Test2 classes diffèrent seulement en termes de savoir si l'
y
déclaration a une mission:Le compilateur C# ne fonctionne pas. Si le compilateur JIT n'est une question différente.
bcoz,
The default value of an integral type is equivalent to the literal 0
. (via MSDN)Oui, je sais que c'est la valeur par défaut. Mais il y a de subtiles des cas où il peut réellement faire une différence, au moins pour les champs statiques.
OriginalL'auteur Jon Skeet
Pour un
int
.net, il n'est effectivement pas possible d'attribuernull
comme c'est un type de valeur, plutôt que d'un type de référence, à moins que vous créer unint?
(Nullable<int>
), qui, bien que c'est un type de valeur, a spécial de la sémantique et peut donc avoirnull
lui est assigné.Dans votre exemple, il n'y a pas de point d'attribution de 0 à var2 comme valeur par défaut pour un type int est zéro. Cela dit, je serais très surpris si le compilateur c# (bien que cela puisse être le cas de tha le compilateur produit différents MSIL pour les deux) /CLR interprète traite à la fois comme étant exactement le même.
Garder à l'esprit que dans le présent, en fin de compte inutile, la fonction, vous obtiendrez une erreur de compilation pour la tentative de comparer
s
eti
que les deux sont "non assigné les habitants". Ceci est différent de variables membres d'une classe, comme:ça m'apprendra à essayer d'utiliser mon cerveau après un verre et demi de vin! =)
Hehe, mais votre toujours rapide à mettre à jour 😉
J'ai mes moments =)
OriginalL'auteur Rob
Je ne dirais pas que ce dernier est une mauvaise pratique. C'est plus explicite et bien connu de l'idiome parmi les programmeurs de C-style de langues.
C'est pourquoi j'ai dit "C-style".
OriginalL'auteur Tamás Szelei
Tout non initialisée utilisation d'une variable en C# va générer un message d'avertissement du compilateur (si il existe au moins un chemin de code de la ne pas initialise). Et il ne doit pas être tous les avertissements dans votre code final!
Dans la deuxième déclaration, vous spécifiez une valeur par défaut. Dans la première déclaration que vous avez supposé que tous les code-chemins affecter une valeur à elle.
OriginalL'auteur ankitjaininfo
Vous aurez envie d'initialiser variables locales de type de référence à null si il n'y a pas d'autre valeur explicite de passe, ou vous serez confronté à des "non initialisé la variable locale" des erreurs de compilation. Exemple:
Err
Il en va de même pour les autres types de variables locales, à la fois de référence et le type de valeur.
Dans votre exemple, il utilise un type de la valeur et de la variable locale doit être déclaré:
La même bonne forme pour les types référence est:
D'autre part Champs par exemple, les membres de "variables" sont au niveau de la classe, vous n'avez pas besoin d'assigner une valeur explicite.
Voir aussi:
OriginalL'auteur John K
Vous ne pouvez pas affecter null à un type de valeur tels que
int
. Cependant, dans les versions ultérieures de .NET, vous pouvez utiliser nullable types de valeur:Ce n'est pas une mauvaise pratique pour initialiser des variables dans leurs déclarations. En fait, c'est tout le contraire. Ce faisant, il ne fait aucun doute dans l'esprit de quiconque au sujet de la valeur de la variable après il déclaré.
Aussi, il y a un minimum de performances pour l'affectation de la valeur null à une variable que vous n'avez pas besoin de s'inquiéter à ce sujet. L'accent sur la programmation, pour la précision de la fonctionnalité avant tout, une fois que vous avez, puis de l'ajuster pour toute flagrante des problèmes de performances qui peuvent survenir.
OriginalL'auteur
Un nombre entier est un type de valeur, de sorte qu'il ne peut pas être initialisé à null.
La perte de performance pour les pré-initialisation est sans doute négligeable, mais si il n'est pas nécessaire, il devrait être évitée. Pour plus de détails, consultez comment le gain de performance par le pas de l'initialisation des variables. Aussi, découvrez Jeff Atwood du blog: Pour de Meilleurs Résultats, Ne pas Initialiser les Variables.
OriginalL'auteur senfo
Le CLR rend difficile que toutes les variables locales seront initialisées à leur valeur par défaut lors de l'entrée dans la méthode avant la première instruction est exécutée. Cette promesse est mis en œuvre par le compilateur JIT. Voir, c'est un peu difficile étant donné que le C# nécessite variables soient initialisées explicitement avant qu'ils ne soient utilisés. Mais voici un exemple:
Utiliser Debug + Windows + Démontage pour voir le code généré:
Réécrire cette initialiser ix à zéro ce code:
Eh bien, c'est un peu triste. Le compilateur JIT est généralement assez bon à l'optimisation de code inutile de suite, mais les tentatives maladroites dans ce cas particulier.
Donc, vous êtes un ami qui est juste. Au moins pour le compilateur JIT x86, pas à proximité d'une machine x64 droit maintenant. La surcharge est probablement près de la moitié d'une nanoseconde. Pas quelque chose qui est facile à mesurer.
OriginalL'auteur Hans Passant
Si vous parlez des variables de membre, il y a peut-être une autre raison de ne pas les initialiser avec leurs valeurs par défaut: le FxCop de la conformité à la règle
CA1805: DoNotInitializeUnnecessarily
.Si l'une des conditions est d'écrire FxCop code compatible, vous ne peut pas initialiser des variables avec des valeurs par défaut.
Voigt: réponse modifiée. Merci de noter la différence.
OriginalL'auteur Arseni Mourzenko