propriété statique en c # 6

J’écris un petit code pour mieux comprendre la property et static property . Comme ceux-ci:

 class UserIdentity { public static IDictionary OnlineUsers { get; set; } public UserIdentity() { OnlineUsers = new Dictionary(); } } 

ou

 class UserIdentity { public IDictionary OnlineUsers { get; } public UserIdentity() { OnlineUsers = new Dictionary(); } } 

Depuis que je l’ai changé pour:

 class UserIdentity { public static IDictionary OnlineUsers { get; } public UserIdentity() { OnlineUsers = new Dictionary(); } } 

cela m’a donné un message d’erreur:

La propriété ou l’indexeur ‘UserIdentity.OnlineUsers’ ne peut pas être affecté – il est en lecture seule

Je savais que la propriété OnlineUsers était en read only , mais en C # 6, je peux l’affecter via le constructeur. Alors, qu’est-ce qui me manque?

Vous essayez d’affecter une propriété statique en lecture seule dans un constructeur d’instance. Cela provoquerait son affectation à chaque fois qu’une nouvelle instance est créée, ce qui signifierait qu’elle n’est pas en lecture seule. Vous devez lui affecter dans le constructeur statique:

 public static IDictionary OnlineUsers { get; } static UserIdentity() { OnlineUsers = new Dictionary(); } 

Ou vous pouvez simplement le faire en ligne:

 public static IDictionary OnlineUsers { get; } = new Dictionary(); 

Tout d’abord, il manque la parenthèse () vos constructeurs. Un constructeur correct ressemble à ceci:

 public class UserIdentity { public UserIdentity() { ... } } 

Pour votre question: les propriétés en lecture seule ne peuvent être atsortingbuées que dans le constructeur du contexte spécifique. Une propriété static n’est pas liée à une instance spécifique mais à la classe.

Dans votre deuxième extrait de code, OnlineUsers est non statique et peut donc être affecté dans le constructeur d’une nouvelle instance et uniquement à cet OnlineUsers .

Dans votre troisième extrait, OnlineUsers est statique. Ainsi, il ne peut être affecté qu’à un initialiseur statique.

 class UserIdentity { public static IDictionary OnlineUsers { get; } //This is a static initializer, which is called when the first reference to this class is made and can be used to initialize the statics of the class static UserIdentity() { OnlineUsers = new Dictionary(); } } 

La propriété readonly statique doit être affectée dans un constructeur statique comme suit:

 public static class UserIdentity { public static IDictionary OnlineUsers { get; } static UserIdentity() { OnlineUsers = new Dictionary(); } }