Pourquoi dois-je attribuer une valeur à un int en C# lorsque la valeur par défaut est 0?
Cela fonctionne:
class MyClass
{
int a;
public MyClass()
{
int b = a;
}
}
Mais cela donne une erreur du compilateur ("utilisation de la variable locale non assignée 'a'"):
class MyClass
{
public MyClass()
{
int a;
int b = a;
}
}
Pour autant que je sache, cela se produit parce que dans le premier exemple, techniquement, le compilateur ne sait pas que 'a' n'est pas assigné. Dans ce dernier exemple, 'a' est défini localement, et est donc facile à suivre.
Mais pourquoi ce dernier exemple ne fonctionne-t-il pas?
Les entiers ne sont-ils pas par défaut à 0? Est-ce quelque chose que le compilateur applique pour les "meilleures pratiques". Ou est-il une autre raison?
5 réponses
Dans le premier exemple, il s'agit d'un champ . Champs automatiquement par défaut à 0 / false / null. Dans le second exemple, il s'agit d'une variable . Les Variables sont pas par défaut, et doivent avoir une "affectation définie" avant d'être utilisées.
Essentiellement, lors de la création d'un objet (ou de l'initialisation d'une structure), il met à zéro la mémoire (ou dans le cas d'un struct ctor non par défaut, vous oblige à tout initialiser manuellement). Cependant, les variables sont si communes (dans chaque méthode) qu'elles ne veut pas la surcharge d'avoir à zéro la pile tout le temps. Cela vous oblige à indiquer la valeur initiale.
Les entiers ne sont-ils pas par défaut à 0?
Ils le font quand ils sont membres de données d'une classe, mais pas quand ils sont une variable locale: les variables locales doivent être initialisées explicitement avant d'être utilisées, d'où l'erreur du compilateur.
Lorsque vous instanciez une nouvelle instance d'une classe, toute la mémoire dont l'objet a besoin est "mise à zéro". C'est pour éviter beaucoup de bugs et de hacks de mémoire étranges qui étaient possibles en C (++). Malheureusement, cela a également un petit coût de traitement, Donc lorsque vous créez une variable locale, la langue suppose que vous définirez la valeur vous-même très bientôt et ne vous embêtez pas à la mettre à zéro pour diminuer le nombre total d'instructions requises. Pour compenser la risque d'utilisation de la mémoire non définie ceci introduit les contrôles du compilateur pour s'assurer qu'une valeur a été définie avant qu'elle ne vous permette d'utiliser la variable.
Cela pourrait être parce que la variable déclarée au niveau de la classe ne peut pas être affectée à la même portée (autre que lors de la déclaration)
Par exemple
class Test
{
int a;
a = 0; // this is not allowed at class level & hence a initialized to default
}
Considérant ce qui suit
class Test
{
void test()
{
int a;
int b = a;
a = 20; // this is allowed
}
}
Selon ma connaissance, lorsque nous déclarons une variable en classe et créons un objet, le constructeur par défaut initialise la variable et il n'est donc pas nécessaire d'initialiser les variables de classe. Mais en venant aux méthodes de la classe, il n'y a pas de constructeur ou quoi que ce soit pour initialiser ces variables, donc nous ne pouvons pas assigner de variables non initialisées dans les méthodes.