2013-08-26 16 views
5

Sınıfımda okuyup okumak istediğim bir List<string> myList sınıfım var. Benim özel üyelerinde benim sınıf içinde myList değerini ve sınıf kullanıcılar için salt okunur yapmak düşündüm bu gibiSet özniteliğini bildirmeyen bir C# Listesi nasıl yapılır

List<strign> myList {get;} 

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

. Ama fark ettim ki bu şekilde herhangi bir değer belirleyemedim.

+0

Kümeye bir erişim elemanı eklersiniz. yani: {get; özel set; } – phillip

+4

Daha spesifik olmanız gerekir. İstemcilerin 'List' referansını değiştirmesini önlemek mi istiyorsunuz yoksa istemcilerin istemcilere öğe ekleyip çıkarmasını önlemek mi istiyorsunuz? –

+0

İstemcinin Liste referansını değiştirmesini önlemek istiyorum. – anmarti

cevap

11

Dene:

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

Bu, sınıf içinde ayarlayın izin verir, ama dışarıda. Bunun, harici istemcilerin listenizi güncellemesini, yalnızca referansı durdurmayacağını unutmayın.

+3

Bu, tüketicilerin tüm myList öğelerini değiştirmesini engeller, ancak onlar hala eklemek/kaldırmak/liste içeriğini değiştirmek – STW

+1

@STW Ben bu noktada açıklığa kavuşturmak için bir not ekledim, teşekkürler. –

0

Özel bir düzenleyici ile ortak özellik istiyorsanız. Aşağıda olduğu gibi.

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

vb List, Koleksiyon için özel ayarlayıcı tüm liste tüketiciler tarafından değiştirilemez anlamına gelir, ama bu listenin kamu üyelerini korumak için hiçbir şey yapmaz. Örneğin

:

Bir Salt Okunur arayüz olarak kalmasına neden listenin üyelerini değiştirerek tüketicileri önlemek amacıyla
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 
    } 
} 

, böyle IEnumerable<string>, ReadOnlyCollection<string> olarak veya ilan dahilinde List.AsReadOnly() arayarak sınıf.

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

Sadece bir not: 'IEnumerable 'olarak gösterilmesi, temel listede yapılacak değişiklikleri önleyecektir. Kullanıcılar, "" Listesini yayınlayabilir ve değişiklik yapabilir. (ama bunu "getiri iadesi" ni kullanmak için doğrudan döndürmek yerine değiştirmek için yeterince kolay, veya önerdiğiniz gibi, "List.AsReadOnly()') –

+0

@ ChrisSinclair true, 'AsReadOnly() 'seçeneklerin daha iyi – STW

+0

Sanırım kodunuzda ikinci bir geçiş yapmanız gerekebilir. Sanırım bazı tip bildirimler/başlatmalar karıştırılmalı ve derlenmeyecek. Muhtemelen 'MyClass' ikinci örneğinizde 'MyList' için özel olarak değişiklik yapmak isteyecektir. –

İlgili konular