2016-07-03 14 views
16

Piszę mały kod, aby lepiej zrozumieć o property i static property. Takie jak:Właściwość statyczna w C# 6

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

lub

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

Odkąd zmienił go do:

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

dał mi komunikat o błędzie:

obiekt lub podziałowe „UserIdentity.OnlineUsers "nie można przypisać do - jest to tylko do odczytu

Znałem właściwość OnlineUsers był read only, ale w C# 6, mogę przypisać go przez konstruktora. Więc, czego mi brakuje?

Odpowiedz

26

Próbujesz przypisać do właściwości statycznej tylko do odczytu w konstruktorze instancji. To spowodowałoby przypisanie go za każdym razem, gdy tworzone jest nowe wystąpienie, co oznaczałoby, że nie jest to tylko odczyt. Trzeba przypisać do niego w statycznym konstruktorze:

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

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

Albo można po prostu zrobić inline:

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

Problemem będzie też zdarzyć w C# 1.0 roku (generycznych na bok), tylko z innej składni do deklarowania OnlineUsers –

+1

@ MartinCapodici: To musiałoby być pole, a nie własność, ponieważ nie mógłbyś mieć "tylko do odczytu własności, do której możesz również przypisać", które zostały dodane w C# 6. –

+0

Matti, to prawda, że ​​byłem myślenie o polu owiniętym właściwością, aby osiągnąć ten sam efekt. –

8

Przede wszystkim konstruktory brakuje nawiasu (). Prawidłowe konstruktor wygląda następująco:

public class UserIdentity { 

    public UserIdentity() { 
     ... 
    } 
} 

za pytanie: właściwości tylko odczyt może być przypisany tylko w konstruktorze konkretnym kontekście. Właściwość static nie jest powiązana z konkretną instancją, ale z klasą.

W drugim fragmencie kodu OnlineUsers nie ma charakteru statycznego, dlatego można go przypisać do konstruktora nowej instancji i tylko tam.

W trzecim urywku, OnlineUsers jest statyczny. Dlatego może być przypisany tylko do statycznego inicjalizatora.

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

statyczna właściwość tylko do odczytu musi być przypisana w konstruktorze statycznym tak:

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

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