c#6中的静态属性
我正在编写一个小代码来更好地理解property
和static property
。 像这些:
class UserIdentity { public static IDictionary OnlineUsers { get; set; } public UserIdentity() { OnlineUsers = new Dictionary(); } }
要么
class UserIdentity { public IDictionary OnlineUsers { get; } public UserIdentity() { OnlineUsers = new Dictionary(); } }
自从我改为:
class UserIdentity { public static IDictionary OnlineUsers { get; } public UserIdentity() { OnlineUsers = new Dictionary(); } }
它给了我错误信息:
无法将属性或索引器“UserIdentity.OnlineUsers”分配给 – 它是只读的
我知道属性OnlineUsers
是read only
,但在C#6中,我可以通过构造函数分配它。 那么,我错过了什么?
您正在尝试分配给实例构造函数中的只读静态属性。 这将导致每次创建新实例时都会分配它,这意味着它不是只读的。 您需要在静态构造函数中为其分配:
public static IDictionary OnlineUsers { get; } static UserIdentity() { OnlineUsers = new Dictionary(); }
或者你可以直接进行:
public static IDictionary OnlineUsers { get; } = new Dictionary();
首先,您的构造函数缺少括号()
。 正确的构造函数如下所示:
public class UserIdentity { public UserIdentity() { ... } }
对于您的问题:只能在特定上下文的构造函数中分配Readonly属性。 static
属性不绑定到特定实例,而是绑定到类。
在你的第二个代码片段中, OnlineUsers
是非静态的,因此它可以在新实例的构造函数中分配,并且仅在那里。
在您的第三个片段中, OnlineUsers
是静态的。 因此,它只能在静态初始化程序中分配。
class UserIdentity { public static IDictionary 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(); } }
必须在静态构造函数中分配静态只读属性,如下所示:
public static class UserIdentity { public static IDictionary OnlineUsers { get; } static UserIdentity() { OnlineUsers = new Dictionary(); } }