C# 6.0 ile beraber gelen Auto-Property Initializers benim su ana kadar C# 6.0 içerisindeki en favori özelliklerimden biri. Bu özellikle en basit anlamda auto-propertyler için default deger atamasi yapabilmekteyiz. Simdi ilk olarak C# 6.0 öncesinde default deger tasiyan bir auto-property nasil yaratiyoruz buna bir bakalim.
class Foo { public string Bar { get; set; } public Foo() { Bar = "Test"; } }
Gördügünüz gibi ilk olarak class içerisinde bir auto-property tanimlamasi yaptik. Sonrasinda da default deger atamasi yapmak için constructor tanimlayip içerisinde default deger atamasi yaptik.
C# içerisinde bulunan auto propertyler bildiginiz gibi derleme esnasinda compiler tarafindan arka planda yeniden yaziliyorlar. Örnegin, yukarida yazdigimiz kod derlenme sirasinda asagidaki gibi yeniden yaziliyor.
internal class Foo { [CompilerGenerated, DebuggerBrowsable(DebuggerBrowsableState.Never)] private string <Bar>k__BackingField; public Foo() { this.Bar = "Test"; } public string Bar { [CompilerGenerated] get { return this.< Bar > k__BackingField; } [CompilerGenerated] set { this.< Bar > k__BackingField = value; } } }
Compilerin arka planda yaptigi transformasyonlari bir kenara birakirsak en tepedeki kullanima baktigimizda, bir auto-property için default deger atamasi yapabilmemiz için constructor tanimlamamiz sart. Yani biraz daha fazla kod yazmak zorunda kaliyoruz. Iste bu nedenden dolayi C# 6.0 ile beraber daha declarative bir sekilde default deger atamasi yapabilmemiz için auto-property initializerlar C# içerisine ekleniyor.
C# 6.0 ile beraber bir auto-property'e default deger atamasini asagidaki sekilde yapabiliyoruz.
class Foo { public string Bar { get; set; } = "Test"; }Gördügünüz gibi hem daha az kod yaziyoruz hem de çok daha declarative bir sekilde tanimlamamizi yapabiliyoruz. Peki compiler kodu derlerken bu auto-property tanimlamasini arka planda nasil yeniden yaziyor ?
internal class Foo { [CompilerGenerated, DebuggerBrowsable(DebuggerBrowsableState.Never)] private string <Bar>k__BackingField = "Test"; public string Bar { [CompilerGenerated] get { return this.< Bar > k__BackingField; } [CompilerGenerated] set { this.< Bar > k__BackingField = value; } } }
Sadece Getter'i Olan Propertyler Için Auto Initializerlar
C# 6.0 öncesinde sadece getter'i olan auto-propertyler yazamiyorduk. Bunun yerine auto-propertyler öncesinde kullandigimiz genisletilmis sekilde yazilan propertyler kullaniyorduk. Örnegin,class Foo { private readonly string bar = "Test"; public string Bar { get { return bar; } } }
Gördügünüz gibi sadece getteri olan bir property tanimlamak için o propertynin döndürecegi degeri içerisinde barindiran readonly fieldi da bizim yaratmamiz gerekiyor. Ancak C# 6.0 ile beraber gelen auto-property initializerlari ile artik sadece getteri olan auto-propertyler tanimlamak mümkün.
class Foo { public string Bar { get; } = "Test"; }Gördügünüz gibi C# 6.0 ile beraber sadece getteri olan property tanimlamak da oldukça basit ve declarative. Compiler'in arka planda yarattigi koda baktigimizda ise C# 6.0 öncesinde yazdigimiz koddan bir farki olmadigini görebiliriz.
internal class Foo { [CompilerGenerated, DebuggerBrowsable(DebuggerBrowsableState.Never)] private readonly string <Bar>k__BackingField = "Test"; public string Bar { [CompilerGenerated] get { return this.< Bar > k__BackingField; } } }Sadece getter'i olan auto-propertyler özellikle bizim immutable nesneler gelistirmemizi de oldukça kolaylastiracak. Yazinin basinda da dedigim gibi bu yenilikler benim C# 6.0 içerisindeki en favori özelliklerimden biri. Sizce de çok faydali ve kolaylastirici degil mi ?
Not : Blog yazilari haricinde sosyal medya üzerinden anlik paylasimlarimi Twitter ve Facebook'tan takip edebilirsiniz.