İlkay İlknur

just a developer...

C# 6.0 - Auto-Property Initializers

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 { getset; }
    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
{
    [CompilerGeneratedDebuggerBrowsable(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 { getset; } = "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
{
    [CompilerGeneratedDebuggerBrowsable(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
{
    [CompilerGeneratedDebuggerBrowsable(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.



Yorum Gönder