web-dev-qa-db-fra.com

Pourquoi l'erreur de compilation "Utilisation d'une variable locale non affectée"?

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...

53
theknut

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.

105
James Michael Hare

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.

9
dasblinkenlight

Les catégories de variables suivantes sont classées comme initialement non affectées :

  • Variables d'instance des variables de struct initialement non affectées.
  • Paramètres de sortie, y compris la variable this des constructeurs d'instance de struct.
  • Variables locales, sauf celles déclarées dans une clause catch ou une instruction foreach.

Les catégories de variables suivantes sont classées comme initialement assignées :

  • Variables statiques.
  • Variables d'instance des instances de classe.
  • Variables d'instance des variables de structure initialement assignées.
  • Éléments de tableau.
  • Paramètres de valeur.
  • Paramètres de référence.
  • Variables déclarées dans une clause catch ou une instruction foreach.
5
Joe

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 
1
Sofian Hnaide

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. 

1
Damith

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.

0
Msonic

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.

0
Cody Gray

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.

0
nabrond