2016-07-03 24 views
16

Sto scrivendo un piccolo codice per ulteriori informazioni su property e static property. Come questi:proprietà statiche in C# 6

class UserIdentity 
{ 
    public static IDictionary<string, DateTime> OnlineUsers { get; set; } 
    public UserIdentity() 
    { 
     OnlineUsers = new Dictionary<string, DateTime>(); 
    } 
} 

o

class UserIdentity 
{ 
    public IDictionary<string, DateTime> OnlineUsers { get; } 
    public UserIdentity() 
    { 
     OnlineUsers = new Dictionary<string, DateTime>(); 
    } 
} 

Da quando ho cambiato in:

class UserIdentity 
{ 
    public static IDictionary<string, DateTime> OnlineUsers { get; } 
    public UserIdentity() 
    { 
     OnlineUsers = new Dictionary<string, DateTime>(); 
    } 
} 

mi ha dato un messaggio di errore:

del proprietario o indicizzatore 'UserIdentity.OnlineUsers 'non può essere assegnato a - è letto solo

Sapevo che la proprietà OnlineUsers era read only, ma in C# 6, posso assegnarla tramite costruttore. Quindi, cosa mi sto perdendo?

risposta

26

Si sta tentando di assegnare a una proprietà statica di sola lettura in un costruttore di istanze. Ciò farebbe sì che venga assegnato ogni volta che viene creata una nuova istanza, il che significherebbe che non è di sola lettura. È necessario assegnare ad essa nel costruttore statico:

public static IDictionary<string, DateTime> OnlineUsers { get; } 

static UserIdentity() 
{ 
    OnlineUsers = new Dictionary<string, DateTime>(); 
} 

Oppure si può semplicemente farlo in linea:

public static IDictionary<string, DateTime> OnlineUsers { get; } = new Dictionary<string, DateTime>(); 
+2

Il problema sarebbe anche accadere in C# 1.0 in poi (farmaci generici a parte), solo con sintassi diversa per dichiarare le onlineUsers –

+1

@ MartinCapodici: Quindi dovrebbe essere un campo e non una proprietà, perché non si può avere una "proprietà di sola lettura che si può anche assegnare a", che sono stati aggiunti in C# 6. –

+0

Matti, è vero che ero pensando a un campo avvolto con una proprietà per ottenere lo stesso effetto. –

8

Prima di tutto, i tuoi costruttori manca la parentesi (). Un costruttore corretta assomiglia a questo:

public class UserIdentity { 

    public UserIdentity() { 
     ... 
    } 
} 

Per la vostra domanda: proprietà di sola lettura per possono essere assegnati solo nel costruttore del contesto specifico. Una proprietà static non è associata a un'istanza specifica ma alla classe.

Nel tuo secondo snippet di codice OnlineUsers non è statico, quindi può essere assegnato al costruttore di una nuova istanza e solo lì.

Nel terzo frammento, OnlineUsers è statico. Pertanto, può essere assegnato solo a un inizializzatore statico.

class UserIdentity 
{ 
    public static IDictionary<string, DateTime> 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<string, DateTime>(); 
    } 
} 
2

Statico proprietà di sola lettura deve essere assegnato nel costruttore statico come questo:

public static class UserIdentity 
{ 
    public static IDictionary<string, DateTime> OnlineUsers { get; } 

    static UserIdentity() 
    { 
     OnlineUsers = new Dictionary<string, DateTime>(); 
    } 
} 
Problemi correlati