2010-07-15 4 views
12

İçinde List alanı olan WhatClass adında bir sınıf var. Sadece bu alanı okuyabilmem gerekiyor, bu yüzden diğer nesnelere ifşa etmek için bir özellik kullandım.List in get özelliği ifşa edilirken, Listeye Ekle yöntemi nasıl korunur?

public class WhatClass 
{ 
    List<SomeOtherClass> _SomeOtherClassItems; 

    public List<SomeOtherClass> SomeOtherClassItems { get { return _SomeOtherClassItems; } } 
} 

Ancak herhangi bir nesne bunu önlemek nasıl

WhatClass.SomeOtherClassItems.Add(item); 

çağırabilir çıkıyor?

cevap

21

, sen .AsReadOnly() uzatma yöntemi için arıyoruz.

Ancak, her özellik erişimi sırasında oluşturmak yerine koleksiyonuna bir referans olarak saklamak gerekir: Aksi API tüketiciler için çok beklenmedik olabilir

private readonly List<SomeOtherClass> _items; 

public WhatClass() 
{ 
    _items = new List<SomeOtherClass>(); 

    this.Items = _items.AsReadOnly(); 
} 

public ReadOnlyCollection<SomeOtherClass> Items { get; private set; } 

Bu x.Items == x.Items geçerlidir sağlamaktır.

ReadOnlyCollection<> açığa çıkarma, salt okunur bir koleksiyonun amacını tüketicilere iletir. _items'daki değişiklikler Items'da yansıtılacaktır.

+0

_items'e eklediğinizde ne olduğunu ve bununla nasıl başa çıktığınızı anlamanız için kitleleri ayrıntılı olarak incelemek isteyebilirsiniz ... –

+2

@Dave - Dokümanlar, değişikliklerin sargıya yansıtılacağını belirtir. – ChaosPandion

+0

Bryan, buradaki yanıt için çok teşekkür ederim, ancak burada salt bir anahtar kelimeye ihtiyacım yok. –

5

Kullanım List<T>.AsReadOnly:

public ReadOnlyCollection<SomeOtherClass> SomeOtherClassItems 
{ 
    get 
    { 
     return _SomeOtherClassItems.AsReadOnly(); 
    } 
} 

Bu bir istemci çağrıları arayüzü üzerinden ekle eğer bir istisna durumu bir ReadOnlyCollection, dönecektir. Ayrıca, ReadOnlyCollection türü bir genel ekleme yöntemi göstermez.

+5

Her seferinde yeni bir örnekleme yapma. – SLaks

+1

@SLaks: Ben senin noktanı görüyorum, ama bu bir mikro optimizasyon ve bu şekilde okumak daha kolay olduğuna inanıyorum. ReadOnlyCollection küçüktür ve GC kısa süreli küçük nesnelerle uğraşırken iyidir ve sınıflarınızın her biri için gereksinim duymadığınız bir alan ve bir ReadOnlyCollection nesnesi ekleyerek daha fazla bellek kullanmayı düşünebilirsiniz. . – Quartermeister

+2

Bir özellik bulucudaki nesneleri ayırmak kötü bir fikirdir. İnsanlar genellikle bir mülk sahibine ulaşmanın, okunan bir hafızadan başka bir şey olmadığını ve bu nedenle büyük iç içe döngülerde mülkiyete birçok kez erişeceğini varsayarlar. – SLaks

6

IList<T> etrafında bir salt okunur sarıcı olan ReadOnlyCollection<T> class'u arıyorsunuz.

ReadOnlyCollection<T> temel listede yer alan değişiklikleri yansıtacağından, her seferinde yeni bir örnek oluşturmanız gerekmez. Örneğin

: Diğerleri söylediler

public class WhatClass { 
    public WhatClass() { 
     _SomeOtherClassItems = new List<SomeOtherClass>(); 
     SomeOtherClassItems = _SomeOtherClassItems.AsReadOnly(); 
    } 

    List<SomeOtherClass> _SomeOtherClassItems; 

    public ReadOnlyCollection<SomeOtherClass> SomeOtherClassItems { get; private set; } 
} 
+0

Cevabınız için teşekkür ederiz. ReadOnlyCollection sınıfından bahsetmiştiniz, ancak kodu buna dahil etmediniz, ancak bunu anladım. Tekrar teşekkürler. –

İlgili konular