Статическое свойство в С# 6

Я пишу небольшой код, чтобы больше узнать о property и static property. Например:

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

или

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

Так как я изменил его на:

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

он дал мне сообщение об ошибке:

Свойство или индексатор 'UserIdentity.OnlineUsers' не может быть присвоен - он доступен только для чтения

Я знал, что свойство OnlineUsers было read only, но в С# 6 я могу назначить его через конструктор. Итак, что мне не хватает?

Ответы

Ответ 1

Вы пытаетесь назначить статическое свойство только для чтения в конструкторе экземпляра. Это приведет к тому, что он будет назначен каждый раз, когда будет создан новый экземпляр, что означает, что он не только для чтения. Вам нужно назначить его в статическом конструкторе:

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

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

Или вы можете просто сделать это inline:

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

Ответ 2

Прежде всего, вашим конструкторам не хватает скобки (). Правильный конструктор выглядит следующим образом:

public class UserIdentity {

     public UserIdentity() {
        ...
     }
}

По вашему вопросу: Свойства Readonly могут быть назначены только в конструкторе конкретного контекста. A static свойство не привязано к определенному экземпляру, а к классу.

В вашем втором фрагменте кода OnlineUsers не статичен, поэтому его можно назначить в конструкторе нового экземпляра и только там.

В вашем третьем фрагменте OnlineUsers является статическим. Таким образом, он может быть назначен только в статическом инициализаторе.

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

Ответ 3

Статическое свойство readonly должно быть назначено в статическом конструкторе следующим образом:

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

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