I\'m writing a small code to more understand about property
and static property
. Like these:
class UserIdentity
{
public static
Static readonly property must be assigned in static constructor like this:
public static class UserIdentity
{
public static IDictionary<string, DateTime> OnlineUsers { get; }
static UserIdentity()
{
OnlineUsers = new Dictionary<string, DateTime>();
}
}
You're trying to assign to a read only static property in an instance constructor. That would cause it to be assigned every time a new instance is created, which would mean it's not read only. You need to assign to it in the static constructor:
public static IDictionary<string, DateTime> OnlineUsers { get; }
static UserIdentity()
{
OnlineUsers = new Dictionary<string, DateTime>();
}
Or you can just do it inline:
public static IDictionary<string, DateTime> OnlineUsers { get; } = new Dictionary<string, DateTime>();
First of all, your constructors are missing the parenthesis ()
. A correct constructor looks like this:
public class UserIdentity {
public UserIdentity() {
...
}
}
For your question:
Readonly properties can only be assigned in the constructor of the specific context. A static
property is not bound to a specific instance but to the class.
In your second code snippet OnlineUsers
is non static, thus it can be assigned to in the constructor of a new instance, and only there.
In your third snippet, OnlineUsers
is static. Thus, it can only be assigned to in a static initializer.
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>();
}
}