SORU
29 AĞUSTOS 2008, Cuma


Nasıl bir koleksiyon özelliği ortaya çıkarmak için?

Eh işte bir koleksiyon özelliği bunu yapmak için en iyi yol üzerinde olan bir nesne oluşturmak her zaman?

  1. bir alıcı ile ortak özelliği döner özel değişken için bir referans
  2. açık get_ObjList ve set_ObjList yöntemleri dönmek ve yeni veya klonlanmış oluşturun nesneler her zaman
  3. açık get_ObjList döndüren bir Ienumerator ve bir set_ObjList bu IEnumerator alır

Eğer toplama bir dizi (yani, objList.eğer bir fark yaratır mı() Klon) karşı bir Liste?

Eğer bir referans olarak gerçek bir koleksiyon dönen bağımlılıklar yaratır çünkü o kadar kötü ise, neden referans olarak herhangi bir özelliği dönün? Her zaman bir çocuk, bu çocuğun iç ebeveyni olmadan değiştirilebilir bir referans nesne olarak "bilmek" bu çocuğun bir özelliği yoksa " olay değişti. seni ifşa Bellek sızıntıları için bir risk var mı?

Ve sakın 3 seçenek 2 seri sonu? Bu bir catch 22 veya özel serileştirme her zaman uygulamak için bir koleksiyon özelliği var mı?

Genel ReadOnlyCollection genel kullanım için iyi bir uzlaşma gibi görünüyor. IList sarar ve erişimi kısıtlar. Belki de bu bellek sızıntıları ve seri ile yardımcı olur. Ancak yine de enumeration concerns vardır

Belki yerine göre değişir. Eğer toplama değiştirilmiş olması umurunda değilse, o zaman sadece #1 başına özel bir değişken üzerinde ortak bir erişimci olarak kullanır. Eğer diğer programlar koleksiyonu değiştir o zaman istemesen bile #2 ve/veya #3 daha iyi.

Akla hemen şu soru neden bir yöntem, güvenlik, bellek, seri hale getirme, vb sonuçları ne başka bir yere ve kullanılmalıdır.?

CEVAP
1 EYLÜL 2008, PAZARTESİ


Nasıl bir koleksiyon tamamen kullanıcılar ile etkileşim için tasarlanmıştır ne bağlı bırakmayın.

1)Eğer kullanıcılar ve bir nesnenin koleksiyondan ekleme ve çıkarma yapılacak ise, o zaman basit bir özelliği en iyi (#1 asıl soru seçeneği) toplama-sadece:

private readonly Collection<T> myCollection_ = new ...;
public Collection<T> MyCollection {
  get { return this.myCollection_; }
}

Bu strateji, kullanıcıların ve kontrol görüntülemek istediğiniz öğeleri Ekle / Kaldır nerede WindowsForms ve ItemsControl WPF denetimleri Items koleksiyonları için kullanılır. Bu kontroller gerçek bir koleksiyon yayınlamak ve geri aramaları veya olay dinleyicileri öğeleri izlemek için kullanın.

WPF de bazı ayarlanabilir koleksiyonları kullanıcılar kontrol öğeleri, ItemsControl ItemsSource özelliği (#3 özgün soru seçeneği) gibi bir koleksiyon görüntülemek için izin gösterir. Ancak, bu ortak bir senaryo değildir.

2)Eğer kullanıcılar sadece veri nesnesi tarafından korunan okuma, Quibblesome önerdiği gibi salt okunur bir koleksiyonu kullanabilirsiniz:

private readonly List<T> myPrivateCollection_ = new ...;
private ReadOnlyCollection<T> myPrivateCollectionView_;
public ReadOnlyCollection<T> MyCollection {
  get {
    if( this.myPrivateCollectionView_ == null ) { /* lazily initialize view */ }
    return this.myPrivateCollectionView_;
  }
}

ReadOnlyCollection<T> temel toplama ve canlı bir görünüm sağlar, tek bir görünüm yaratmak için olduğunu unutmayın.

Eğer iç koleksiyon IList<T>, uygulamak istemediği ya da daha ileri düzey kullanıcılar için erişimi kısıtlamak istiyorsanız, bunun yerine bir kaptan ile koleksiyonuna erişim sarın

public IEnumerable<T> MyCollection {
  get {
    foreach( T item in this.myPrivateCollection_ )
      yield return item;
  }
}

Bu yaklaşımı uygulamak için basit ve aynı zamanda iç koleksiyon göstermeden tüm üyelerine erişim sağlar. Ancak, toplama KÜÇÜK koleksiyon sınıfları yeniden düzenlenmiş bir koleksiyon sıralamak için çalışırsanız istisna olarak unmodfied, kalmasını gerektirmez. Eğer temel koleksiyonuna değiştirecek, tahsilat güvenli bir şekilde numaralandırma hafif bir sarıcı oluşturmak veya toplama bir kopyasını iade edebilirsiniz.

3)Son olarak, gerekirse açığa diziler yerine, yüksek düzeyde koleksiyonları, daha sonra iade bir kopyasını dizi önlemek için kullanıcılardan değiştirme (seçenek #2 özgün soru):

private T[] myArray_;
public T[] GetMyArray( ) {
  T[] copy = new T[this.myArray_.Length];
  this.myArray_.CopyTo( copy, 0 );
  return copy;
  // Note: if you are using LINQ, calling the 'ToArray( )' 
  //  extension method will create a copy for you.
}

Kullanıcılar değiştirdiğinizde söylemek mümkün olmayacak gibi bir özelliği ile temel dizi göstermek gerekir. Diziyi izin vermek için ya da SetMyArray( T[] array ) karşılık gelen bir yöntemi eklemek veya özel bir indeksleyiciyi kullanabilirsiniz:

public T this[int index] {
  get { return this.myArray_[index]; }
  set {
    // TODO: validate new value; raise change event; etc.
    this.myArray_[index] = value;
  }
}

(özel bir dizin oluşturucu uygulayarak elbette, KÜÇÜK sınıfların çalışma çoğaltarak olacak :)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Justin Case

    Justin Case

    3 EKİM 2011
  • kamaniusilelis

    kamaniusilel

    10 HAZİRAN 2011
  • MrOctopi

    MrOctopi

    6 Aralık 2010