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, CurrentTimemülke her eriştiğinizde bu DateTime.UtcNowdeğerlendirilmeye neden olur , böylece potansiyel olarak farklı bir sonuç elde edersiniz.
Farklardan biri bunun ne zaman 0değ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;
}
StartMülkiyet ederken, (örnek ne zaman oluşturulduğuna) aynı zamanda dönen tutar Nowdeğ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 getanahtar 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.