28 Eylül 2017 Perşembe

Auto Property Initializer For Read Only Fields

Giriş
Auto Property Initializer For Read Only Fields C# 6.0 ile gelen bir özellik. Sadece getter metodu var.

Bu özelliğin iki farklı alt çeşidi var. İlki constructor içinde atanan değer, ikincisi ise çağrılma anında atanan değer yani "expression bodied property".

Birinci çeşit property = ... şeklinde kodlanır
İkinci çeşit property => ... şeklinde kodlanır

1. Constructor içinde atanan değer (auto property initialization)
Bu yöntemde nesne içind readonly (backing field) bir değişken yaratılır.

Örnek
Şöyle yaparız. Burada alana nesnenin yaratılma anında bir kere değer atanır.
public DateTime DogCreationTime { get; } = DateTime.Now;

Örnek
Şöyle yaparız.
public string Name { get; } = "bob";
Bu kod aslında şununla aynıdır.
private readonly string _name = "bob";

public string Name
{
  get
  {
    return _name ;
  }
}
Örnek
Şöyle yaparız.
public List<String> Names { get; } = new List<String>() {"bob"};
Bu kod aslında şununla aynıdır.
private readonly List<string> _names = new List<string>() {"bob"};

public string Names 
{
  get
  {
    return _names;
  }
}
Örnek
Bu sefer constructor içinde bir değer atamak istersek alanı tanımlamak için şöyle yaparız.
public int Foo { get; } 
Constructor içinde şöyle yaparız.
public MyClass()
{
  Foo = 5;
}

2. Çağrılma anında atanan değer (expression bodied property)

Örnek
Şöyle yaparız. Sabit bir sayı döndüğümüz için constructor içinde atanan değer ile aynı şeydir.
public int Foo => 5;
Bu örnekte Foo alanı için backing field üretilmez. Kod şöyledir.
public int Foo { get { return 5; } }
Örnek
Şöyle yaparız.
public string Name => "bob";
Üretilen kod şöyledir.
public string Name
{
  get
  {
    return "bob";
  }
}
Örnek 
Şöyle yaparız
public List<String> Names => new List<String>() {"bob"};
Üretilen kod şöyledir. He rseferinde yeni liste döner.
public List<string> Names
{
  get
  {
    return new List<string>() {"bob"};
  }
}
3. Farkı Görmek 
constructor içinde atanan değer ve çağrılma anında atanan değer arasındaki farkı görmek için şöyle yaparız. Start alanı constructor içinde atanır. Now alanı ise çağrılma anında atanır
class SomeTestClass
{
  public DateTime Start { get; } = DateTime.Now;

  public DateTime Now => DateTime.Now;
}

Hiç yorum yok:

Yorum Gönder