2013-08-26 27 views
5

Tôi có một lớp học List<string> myList mà tôi muốn chỉ đọc cho người dùng lớp.Cách tạo Danh sách C# chỉ đọc bằng cách không khai báo thuộc tính được thiết lập

List<strign> myList {get;} 

private void SetListValue() 
{ 
    myList = new List<string>(); 
    myList.Add("ss"); 
} 

Như thế này tôi nghĩ tôi có thể thiết lập các myList giá trị bên trong lớp học của tôi trong các thành viên riêng tư của tôi và làm cho nó chỉ đọc cho người sử dụng lớp. Nhưng tôi nhận ra rằng tuyên bố nó theo cách đó tôi không thể đặt bất kỳ giá trị nào.

+0

Bạn thêm người truy cập vào bộ này. tức là: {get; bộ tư nhân; } – phillip

+4

Bạn cần cụ thể hơn. Bạn có muốn ngăn không cho khách hàng thay đổi tham chiếu 'Danh sách' hay bạn muốn ngăn không cho khách hàng thêm mục vào hoặc xóa mục khỏi danh sách? –

+0

Tôi muốn ngăn khách hàng thay đổi tham chiếu Danh sách. – anmarti

Trả lời

11

Hãy thử:

public List<string> myList {get; private set;} 

Điều này sẽ cho phép bạn đặt nó bên trong lớp học của bạn, nhưng không phải bên ngoài. Lưu ý rằng điều này sẽ không ngăn các khách hàng bên ngoài cập nhật danh sách của bạn, chỉ là tham chiếu đến danh sách đó.

+3

Điều này sẽ ngăn người tiêu dùng thay thế toàn bộ 'myList', nhưng họ vẫn có thể thêm/xóa/sửa đổi nội dung danh sách – STW

+1

@STW Tôi đã thêm ghi chú để làm rõ điểm đó, cảm ơn. –

0

Bạn muốn có tài sản công cộng có công cụ đặt riêng tư. Như sau.

public List<string> myList { get; private set; } 
5

Thiết lập riêng cho danh sách, bộ sưu tập, v.v. có nghĩa là không thể thay thế toàn bộ danh sách, nhưng không có gì để bảo vệ thành viên công khai trong danh sách.

Ví dụ:

public class MyClass 
{ 
    public IList<string> MyList {get; private set;} 

    public MyClass() 
    { 
    MyList = new List<string>(){"One","Two", "Three"}; 
    } 
} 

public class Consumer 
{ 
    public void DoSomething() 
    { 
     MyClass myClass = new MyClass(); 

     myClass.MyList = new List<string>(); // This would not be allowed, 
              // due to the private setter 

     myClass.MyList.Add("new string"); // This would be allowed, because it's 
             // calling a method on the existing 
             // list--not replacing the list itself 
    } 
} 

Để ngăn chặn người tiêu dùng từ thay đổi các thành viên trong danh sách bạn có thể phơi bày nó như một giao diện Read-only, như IEnumerable<string>, ReadOnlyCollection<string>, hoặc bằng cách gọi List.AsReadOnly() trong tuyên bố lớp học.

public class MyClass 
{ 
    public IList<string> MyList {get; private set;} 

    public MyClass() 
    { 
    MyList = new List<string>(){"One","Two", "Three"}.AsReadOnly(); 
    } 
} 

public class Consumer 
{ 
    public void DoSomething() 
    { 
     MyClass myClass = new MyClass(); 

     myClass.MyList = new List<string>(); // This would not be allowed, 
              // due to the private setter 

     myClass.MyList.Add("new string"); // This would not be allowed, the 
             // ReadOnlyCollection<string> would throw 
             // a NotSupportedException 
    } 
} 
+1

Chỉ cần lưu ý: việc hiển thị nó là 'IEnumerable 'sẽ _không_ ngăn chặn các sửa đổi đối với danh sách cơ bản. Người dùng vẫn có thể truyền tới 'Danh sách ' và thực hiện thay đổi. (nhưng nó đủ dễ dàng để thay đổi nó thay vì trực tiếp trả về nó để sử dụng 'return return', hoặc như bạn đề nghị,' List.AsReadOnly() ') –

+0

@ChrisSinclair true,' AsReadOnly() 'là lựa chọn tốt hơn – STW

+0

Tôi nghĩ bạn có thể cần phải vượt qua lần thứ hai trên mã của bạn. Tôi nghĩ rằng bạn có một số loại khai báo/khởi tạo hỗn hợp và sẽ không biên dịch. Và có khả năng 'MyClass' sẽ muốn sửa đổi riêng tư thành' MyList' trong ví dụ thứ hai của bạn. –

Các vấn đề liên quan