Yanıtlar:
Evet, ikisi de salt okunur, ancak bir fark var. İlkinde, yapıcı yürütülmeden önce 0 olarak başlatılan bir destek alanı vardır. Değeri , normal bir salt okunur alan gibi yalnızca yapıcıda değiştirebilirsiniz . Alıcının kendisi yalnızca alanın değerini döndürür.
İkincisinde, alıcı her seferinde 0 döndürür ve herhangi bir alan içermez.
Dolayısıyla, otomatik olarak uygulanan özellikleri veya ifade gövdeli üyeleri kullanmaktan kaçınmak için:
İlk versiyon
private readonly int _number = 0;
public int Number { get { return _number; } }
İkinci versiyon
public int Number { get { return 0; } }
Farkın daha net bir örneği şöyle görülebilir:
public DateTime CreationTime { get; } = DateTime.UtcNow;
public DateTime CurrentTime => DateTime.UtcNow;
Tek bir nesne oluşturursanız, CreationTime
özelliği her zaman aynı sonucu verir - çünkü nesne yapısında başlatılan salt okunur bir alanda depolanır. Ancak, CurrentTime
mülke her eriştiğinizde bu DateTime.UtcNow
değerlendirilmeye neden olur , böylece potansiyel olarak farklı bir sonuç elde edersiniz.
Farklardan biri bunun ne zaman 0
değerlendirildiğidir: nesne oluştururken veya özellik kullanıldığında.
DateTime özellikleri ile bunu daha iyi görebilirsiniz:
class SomeTestClass
{
public DateTime Start { get; } = DateTime.Now;
public DateTime Now => DateTime.Now;
}
Start
Mülkiyet ederken, (örnek ne zaman oluşturulduğuna) aynı zamanda dönen tutar Now
değişiklikler geçerli zamanı yansıtacak şekilde.
Açıklama :
İlk sürüm ("Başlat"), kurucu tarafından üzerine yazılabilecek bir başlangıç değeri sağlar. Yani bu sadece bir kez değerlendirilir.
İkinci sürüm ("Now"), bu özelliğin "alıcısı" olacak ifadeyi sağlar. Bu özellik, özellik her okunduğunda değerlendirilir. Oluşturucunun üzerine yazabileceği bir destek alanı bile yoktur.
Bunlar C # 6 dil özellikleridir.
İlk örnek
public int Number { get; } = 0
İlk örnek, yalnızca alıcıya özgü bir otomatik özelliktir . Yalnızca alıcı otomatik özelliğinin destek alanı örtülü olarak salt okunur olarak bildirilir.
İkinci örnek
public int Number => 0;
İkinci örnek, özellik benzeri işlev üyeleri üzerindeki ifade gövdeleridir . Herhangi bir get
anahtar kelime olmadığını unutmayın : İfade gövdesi sözdiziminin kullanılmasıyla ima edilir.
Her ikisi de salt okunur.
random.NextInt()
. İlk sürüm bunu bir kez değerlendirecek ve her zaman aynı değere sahip olacaktır. İkincisi her seferinde yeni bir değer döndürür.