2016-07-03 14 views
16

Tôi đang viết một mã nhỏ để hiểu rõ hơn về propertystatic property. Như thế này:thuộc tính tĩnh trong C# 6

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

hoặc

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

Kể từ khi tôi thay đổi nó để:

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

nó đã cho tôi thông báo lỗi:

tài sản hoặc indexer 'UserIdentity.OnlineUsers 'không thể được gán cho - nó chỉ được đọc

Tôi biết thuộc tính OnlineUsersread only, nhưng trong C# 6, tôi có thể gán nó thông qua hàm tạo. Vì vậy, tôi đang thiếu gì?

Trả lời

26

Bạn đang cố gán cho một thuộc tính tĩnh chỉ đọc trong một hàm tạo mẫu. Điều đó sẽ khiến nó được gán mỗi khi một cá thể mới được tạo ra, điều đó có nghĩa là nó không chỉ đọc. Bạn cần phải gán cho nó trong constructor tĩnh:

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

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

Hoặc bạn chỉ có thể làm điều đó inline:

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

vấn đề này cũng sẽ xảy ra trong C# 1.0 trở đi (generics sang một bên), chỉ với cú pháp khác nhau cho tuyên bố OnlineUsers –

+1

@ MartinCapodici: Sau đó, nó sẽ phải là một lĩnh vực và không phải là một tài sản, bởi vì bạn không thể có một "tài sản chỉ đọc mà bạn cũng có thể gán cho", được thêm vào trong C# 6. –

+0

Matti, đó là sự thật tôi đã suy nghĩ của một lĩnh vực được bao bọc bởi một tài sản để đạt được hiệu quả tương tự. –

8

Trước hết, nhà thầu của bạn đang thiếu ngoặc (). Một nhà xây dựng đúng trông như thế này:

public class UserIdentity { 

    public UserIdentity() { 
     ... 
    } 
} 

Đối với câu hỏi của bạn: thuộc tính chỉ đọc chỉ có thể được gán trong constructor của bối cảnh cụ thể. Một tài sản static không bị ràng buộc với một trường hợp cụ thể nhưng đến lớp học.

Trong đoạn mã thứ hai OnlineUsers của bạn không tĩnh, do đó nó có thể được gán vào trong hàm tạo của một cá thể mới và chỉ ở đó.

Trong đoạn thứ ba của bạn, OnlineUsers là tĩnh. Do đó, nó chỉ có thể được gán cho một bộ khởi tạo tĩnh.

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

tài sản readonly tĩnh phải được chỉ định trong constructor tĩnh như thế này:

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

    static UserIdentity() 
    { 
     OnlineUsers = new Dictionary<string, DateTime>(); 
    } 
} 
Các vấn đề liên quan