J'ai l'impression que le runtime n'autorise pas vraiment de valeurs "non attribuées". En particulier, un type de référence qui n'est pas initialisé aura toujours une valeur nulle, jamais la valeur laissée par une invocation précédente de la méthode ou une valeur aléatoire. Est-ce correct ?
Je constate que personne n'a encore répondu à votre question.
La réponse à la question que vous avez posée est "en quelque sorte".
Comme d'autres l'ont noté, certaines variables (éléments de tableaux, champs, etc.) sont classées comme étant automatiquement "initialement assignées" à leur valeur par défaut (qui est nulle pour les types de référence, zéro pour les types numériques, false pour les bools, et la récursion naturelle pour les structures définies par l'utilisateur).
Certaines variables ne sont pas classées comme initialement assignées ; les variables locales en particulier ne sont pas initialement assignées. Elles doivent être classées par le compilateur comme "définitivement assignées" à tous les points où leur valeurs sont utilisés.
Votre question est donc en fait "est-ce qu'une variable locale qui est classifiée comme non définitivement attribué en fait initialement attribué de la même manière qu'un champ le serait ?" Et la réponse à cette question est oui Dans la pratique, le moteur d'exécution attribue initialement tous les locaux.
Il possède plusieurs propriétés intéressantes. Premièrement, vous pouvez observer dans le débogueur qu'ils sont dans leur état par défaut avant leur première affectation. Deuxièmement, il n'y a aucune chance que le ramasseur d'ordures soit amené à déréférencer un mauvais pointeur simplement parce qu'il restait des ordures sur la pile qui sont maintenant traitées comme une référence gérée. Et ainsi de suite.
Le temps d'exécution est autorisé de laisser l'état initial des locaux comme n'importe quelle ordure qui s'y trouvait si cela peut se faire en toute sécurité. Mais en tant que détail d'implémentation, il ne choisit jamais de le faire. Il met à zéro la mémoire d'une variable locale de manière agressive.
La raison de la règle selon laquelle les locaux doivent être définitivement attribués avant d'être utilisés est donc la suivante. pas pour vous empêcher d'observer l'état non initialisé du local. C'est déjà inobservable parce que le CLR efface agressivement les locales à leurs valeurs par défaut, comme il le fait pour les champs et les éléments de tableau. La raison pour laquelle ceci est illégal en C# est que l'utilisation d'un local non assigné a une forte probabilité d'être un bug. Nous le rendons simplement illégal, et le compilateur vous empêche alors d'avoir un tel bug.