12
votes

C # Initialisation du Dictionnaire compilation Incooussement

Le code suivant compile, mais échoue avec un NullReferenceException code>: xxx pré>

si vous remplacez la ligne marquée "échoue" avec ce qui suit, cela fonctionne (comme prévu ): P>

Dictionary = new Dictionary<string, string> 


0 commentaires

3 Réponses :


33
votes

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 xxx

est pour les cas où le L'appelant a lire accès à une propriété de collection, mais pas écrire accès. En d'autres termes, des situations telles que ceci: xxx

essentiellement, il finit par être des appels à ajouter, mais sans créer une nouvelle collection en premier. Donc, ce code: xxx

est équivalent à: xxx

un bon exemple de l'endroit où cela est utile est avec le < Code> Contrôles Collection pour une interface utilisateur. Vous pouvez faire ceci: xxx

mais vous ne pouvez pas réellement définir la propriété propriété, car il est en lecture seule .


3 commentaires

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 aurait dû être un drapeau rouge. Mais n'ayant jamais utilisé cette syntaxe, j'ai pris l'opérateur égal trop littéralement.



1
votes

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.

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.

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.

(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)


1 commentaires

Assez juste. Jon a répondu à votre question, donc je pensais que je remplirais la raison en cas de compromis.



4
votes

Vous pouvez toujours utiliser la syntaxe souhaitée dans un constructeur: xxx


0 commentaires