Статическое свойство в С# 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>();
}
}