2016-07-03 14 views
16

Ich schreibe einen kleinen Code zu mehr über property und static property zu verstehen. Wie diese:statische Eigenschaft in C# 6

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

oder

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

Da habe ich es zu:

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

es gab mir Fehlermeldung:

oder der Indexer ‚UserIdentity.OnlineUsers 'kann nicht zugeordnet werden - es ist nur lesbar

Ich wusste, dass die Eigenschaft OnlineUsersread only war, aber in C# 6 kann ich es über Konstruktor zuweisen. Also, was vermisse ich?

Antwort

26

Sie versuchen, einer schreibgeschützten statischen Eigenschaft in einem Instanzkonstruktor zuzuweisen. Das würde dazu führen, dass es jedes Mal zugewiesen wird, wenn eine neue Instanz erstellt wird, was bedeuten würde, dass es nicht schreibgeschützt ist. Sie müssen es in dem statischen Konstruktor zuweisen:

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

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

, oder Sie es inline tun können:

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

Das Problem auch C# 1.0 weiter passiert in würde (Generika beiseite), nur mit unterschiedlicher Syntax für die online erklärt –

+1

@ MartinCapodici: Dann müsste es ein Feld und keine Eigenschaft sein, denn Sie könnten keine "Nur-Lese-Eigenschaft, die Sie auch zuweisen können", die in C# 6 hinzugefügt wurden. –

+0

Matti, das ist wahr, ich war Denken an ein Feld mit einer Eigenschaft eingewickelt, um den gleichen Effekt zu erzielen. –

8

Zunächst einmal Ihre Konstrukteure () die Klammer fehlen. Eine richtige Konstruktor sieht wie folgt aus:

public class UserIdentity { 

    public UserIdentity() { 
     ... 
    } 
} 

Für Ihre Frage: Read-only Eigenschaften können nur in den Konstruktor des spezifischen Kontext zugeordnet werden. Eine static Eigenschaft ist nicht an eine bestimmte Instanz gebunden, sondern an die Klasse.

In Ihrem zweiten Code-Snippet OnlineUsers ist nicht statisch, so kann es im Konstruktor einer neuen Instanz zugewiesen werden, und nur dort.

In Ihrem dritten Snippet ist OnlineUsers statisch. Daher kann es nur in einem statischen Initialisierer zugewiesen werden.

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

Statische Nur-Lese-Eigenschaft muss in statischem Konstruktor wie folgt zugewiesen werden:

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

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