C # 'da OOP hakkında "en iyi uygulamalar" soru var (ama tüm diller için geçerlidir).
Herkese açık olacak nesneyi içeren kütüphane sınıfına sahip olmayı düşünün, mülk erişimi aracılığıyla söyleyin, ancak halkın (bu kütüphane sınıfını kullanan kişiler) bunu değiştirmesini istemiyoruz.
class A
{
// Note: List is just example, I am interested in objects in general.
private List<string> _items = new List<string>() { "hello" }
public List<string> Items
{
get
{
// Option A (not read-only), can be modified from outside:
return _items;
// Option B (sort-of read-only):
return new List<string>( _items );
// Option C, must change return type to ReadOnlyCollection<string>
return new ReadOnlyCollection<string>( _items );
}
}
}
Açıkçası en iyi yaklaşım "seçenek C" dir, ancak çok az nesne ReadOnly değişkenine sahiptir (ve kesinlikle hiçbir kullanıcı tanımlı sınıf yoktur).
A sınıfının kullanıcısı olsaydınız,
List<string> someList = ( new A() ).Items;
orijinal (A) nesneye yayılır mı? Yoksa yorumlarda / belgelerde yazılması şartıyla bir klonu iade etmek uygun mudur? Bu klon yaklaşımının izlemesi oldukça zor hatalara yol açabileceğini düşünüyorum.
C ++ 'da const nesnelerini döndürebildiğimizi ve sadece const olarak işaretlenmiş yöntemleri çağırabileceğinizi hatırlıyorum. C # böyle bir özellik / desen yoktur sanırım? Değilse neden eklemiyorlar? Ben buna const doğruluğu denildiğine inanıyorum.
Ama sonra tekrar ana sorum “ne bekliyorsunuz” ya da Seçenek A ve B'nin nasıl ele alınacağıyla ilgili.