Mon code est le suivant
int tmpCnt;
if (name == "Dude")
tmpCnt++;
Pourquoi y a-t-il une erreur Use of unassigned local variable tmpCnt
? Je sais que je ne l'ai pas explicitement initialisé mais à cause de Tableau des valeurs par défaut un type de valeur est initialisé avec 0
de toute façon La référence me rappelle aussi:
N'oubliez pas que l'utilisation de variables non initialisées en C # n'est pas autorisée.
Mais pourquoi dois-je le faire explicitement si c'est déjà fait par défaut? Ne gagnerait-il pas en performance si je ne devais pas le faire? Je me demandais juste...
Les variables locales ne sont pas initialisées. Vous devez les initialiser manuellement.
Les membres sont initialisés, par exemple:
public class X
{
private int _tmpCnt; // This WILL initialize to zero
...
}
Mais les variables locales ne sont pas:
public static void SomeMethod()
{
int tmpCnt; // This is not initialized and must be assigned before used.
...
}
Donc, votre code doit être:
int tmpCnt = 0;
if (name == "Dude")
tmpCnt++;
En résumé, les membres sont initialisés, pas les sections locales. C'est pourquoi vous obtenez l'erreur du compilateur.
Les affectations par défaut s'appliquent aux membres du groupe, mais pas aux variables locales. Comme Eric Lippert l'a expliqué dans cette réponse , Microsoft aurait pu initialiser localement par défaut, mais ils ont choisi de ne pas le faire car l'utilisation d'un local non attribué est presque certainement un bogue.
Les catégories de variables suivantes sont classées comme initialement non affectées :
Les catégories de variables suivantes sont classées comme initialement assignées :
Bien que les types de valeur aient des valeurs par défaut et ne peuvent pas être null, ils doivent également être explicitement initialisés pour pouvoir être utilisés. Vous pouvez considérer ces deux règles comme des règles côte à côte. Les types de valeur NE peuvent PAS être nuls ==> le compilateur garantit que . Si vous demandez comment? le message d'erreur que vous avez est la réponse. Une fois que vous avez appelé leurs constructeurs, ils ont été initialisés avec leurs valeurs par défaut.
int tmpCnt; // not accepted
int tmpCnt = new Int(); // defualt value applied tmpCnt = 0
les variables locales n'ont pas de valeur par défaut.
Ils doivent être définitivement attribués avant de les utiliser. Cela réduit les chances d'utiliser une variable à laquelle vous pensez avoir attribué une valeur raisonnable, alors qu'en réalité, elle a une valeur par défaut.
Voir ce sujet concernant les booléens non initialisés, mais cela devrait répondre à votre question.
Les variables locales ne sont initialisées que si vous appelez leurs constructeurs (new) ou leur attribuez une valeur.
Les variables locales ne sont pas automatiquement initialisées. Cela ne se produit qu'avec des variables de niveau instance.
Vous devez explicitement initialiser les variables locales si vous souhaitez qu’elles soient initialisées. Dans ce cas, (comme l'explique la documentation liée), définissez la valeur 0 ou utilisez l'opérateur new
.
Le code que vous avez montré tente en effet d'utiliser la valeur de la variable tmpCnt
avant qu'elle ne soit initialisée, et le compilateur en avertit à juste titre.
Le tableau des valeurs par défaut ne s'applique qu'à l'initialisation d'une variable.
Selon la page liée, les deux méthodes d’initialisation suivantes sont équivalentes ...
int x = 0;
int x = new int();
Dans votre code, vous avez simplement défini la variable, mais jamais initialisé l'objet.