Le code suivant compile, mais échoue avec un si vous remplacez la ligne marquée "échoue" avec ce qui suit, cela fonctionne (comme prévu ): P> NullReferenceException code>:
Dictionary = new Dictionary<string, string>
3 Réponses :
Non, ce n'est pas une erreur ... C'est une faille dans votre compréhension de la syntaxe d'initialisation :)
L'idée de la p> est pour les cas où le L'appelant a lire em> accès à une propriété de collection, mais pas écrire em> accès. En d'autres termes, des situations telles que ceci: p> essentiellement, il finit par être des appels à ajouter, mais sans créer une nouvelle collection en premier. Donc, ce code: p> est équivalent à: p> un bon exemple de l'endroit où cela est utile est avec le < Code> Contrôles Code> Collection pour une interface utilisateur. Vous pouvez faire ceci: p> mais vous ne pouvez pas réellement définir em> la propriété code> code> propriété, car il est en lecture seule . p> p>
Il est donc utilisé pour ajouter des éléments à un dictionnaire créé par le constructeur - j'aurais dû comprendre que. Mais c'est une utilisation étrange de l'opérateur égal, car l'effet est d'ajouter à ce qui est déjà dans le dictionnaire (le constructeur peut avoir ajouté d'abord des articles).
En quelque sorte, oui ... mais en même temps, il est utilisé pour définir les valeurs initiales de la collection, de cette manière.
Droite. Le nouveau nouveau code> aurait dû être un drapeau rouge. Mais n'ayant jamais utilisé cette syntaxe, j'ai pris l'opérateur égal trop littéralement.
Il échoue avec une exception de référence NULL, car vous avez déclaré une variable (dictionnaire) qui est inintitulé, il est donc null. P>
Lorsque vous essayez d'ajouter les entrées à l'aide de la syntaxe initialiseur, vous essayez d'écrire des données dans un objet NULL. P>
Lorsque vous remplacez la ligne avec un "= nouveau dictionnaire ...", vous créez un nouvel objet pour le dictionnaire à référencer, et vous pouvez donc ajouter des entrées à elle avec succès. P>
(Dans l'exemple de Jon Skeet, la collection de contrôles doit déjà avoir été créée par le formulaire, d'où cela fonctionne bien) p>
Assez juste. Jon a répondu à votre question, donc je pensais que je remplirais la raison en cas de compromis.
Vous pouvez toujours utiliser la syntaxe souhaitée dans un constructeur: