2012-03-10 22 views
11

Otomatik özellikler kullanıldığında, derleyicinin ekranın arkasında kendi arka alanı oluşturduğunu biliyorum. Ancak, birçok programlarında açıkça aşağıdaYedekleme ile veya desteksiz otomatik özellikler - tercih?

private int _backingField; 

public int Property { get { return _backingField; } } 

arasındaki fark yukarıdaki nedir ve yazma, ben insanlar görüyorum öğrenmek için okumak?

public int Property { get; private set; } 

Ben aslında alıcı ya da setter yan etkileri olduğunda onun bariz özelliğini kullanmak için anlamak, ancak bu çoğu zaman böyle değil. Ayrıca, yapısal alandaki destek alanını açıkça kullanmanız gerektiğini anlıyorum, üyelerine mülkler aracılığıyla erişemezsiniz.

ı bulmak mümkün olmuştur tek fark o zaman basit tercihi mi. Değerini çağırma yolu tanımlanan sınıfın içinde farklı olduğudur, yoksa onun mülkiyet veya üzerinden bir değer arayarak daha şeydir doğrudan alana erişerek? Basit kurallar?

cevap

14

Bu iki parçacık arasında çok fazla fark yoktur - örneğin, bir özelliği referans olarak geçiremezsiniz, ancak bu nadiren sorun olur. İsterseniz Ancak, saha böyle, salt okunur olması:

private readonly int _backingField;  
public int Property { get { return _backingField; } } 

sonra bir fark var. Yukarıda yazdığım kod, değerin sınıf içinde başka bir yerde değiştirilmesini önler ve bunun gerçekten değişmez olduğu anlamına gelir. Sadece yapıcıda ayarlanabilen salt okunur bir otomatik uygulama özelliğiyle salt okunur bir alanı bildirmeyi gerçekten çok isterdim - ancak şu anda mevcut değil.

Bu arada, oldukça kafa karıştırıcı: Ayrıca

, ben açıkça, sen özellikleri aracılığıyla üyelerini erişemez yapılar durumunda destek alanını kullanmak zorunda olduğunu anlıyoruz.

Ne demek istiyorsun? Yapıları içerisindeki özellikleri kesinlikle kullanabilirsiniz. Eğer değişken yapılar olan alanları destek mi bahsediyoruz yani arasındaki fark:

foo.someField.X = 10; 

ve

foo.SomeProperty.X = 10; 

? Eğer öyleyse, ben normalde değişmez benim yapılar yaparak bir sorunu olmanın dersem, bir örnek olarak XNA Vector2 kullanma :)

+1

başlamak önlemek kamu Vector2 TheVector {get; set; } TheVector.X = 10; Bunun yerine, gerçek alanı kullanmalıyım. Değer/referansa göre geçiş hakkında bir şey. (C# için değer/referans olarak geçen süreyi açıklığa kavuşturan bir okuma materyaliniz var mı?) – Taelia

+0

Ayrıca, iki örneğim arasında gerçekten bir fark olmasaydı, neden bu kadar çok kişi hala bir destek alanı yaratacaktır? amaç)? – Taelia

+0

@Taelia: Doğru, bu normalde kaçınacağım, değişebilen bir yapının durumu. Çünkü özellik değerin bir kopyasını döndürür. Ve diğer insanların yaptıklarına sebep vermeye çalışmıyorum. –

İlgili konular