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