Baktığınız şey lambda ifadesi değil , ifade gövdeli bir üyedir .
Derleyici, ifade gövdeli bir özellik üyesiyle karşılaştığında, bunu esas olarak şöyle bir alıcıya dönüştürür:
public int MaxHealth
{
get
{
return Memory[Address].IsValid ? Memory[Address].Read<int>(Offs.Life.MaxHp) : 0;
}
}
(Kodu TryRoslyn adlı bir araca pompalayarak bunu kendiniz doğrulayabilirsiniz .)
İfade gövdeli üyeler - çoğu C # 6 özelliği gibi - sadece sözdizimsel şekerdir . Bu, mevcut özellikler yoluyla elde edilemeyen işlevler sağlamadığı anlamına gelir. Bunun yerine, bu yeni özellikler daha anlamlı ve özlü bir sözdiziminin kullanılmasına izin verir
Gördüğünüz gibi, ifade gövdeli üyelerin mülk üyelerini daha kompakt hale getiren birkaç kısayolu vardır:
- Bir
return
ifade kullanmaya gerek yoktur, çünkü derleyici ifadenin sonucunu döndürmek istediğinizi çıkarabilir
- Bir ifade bloğu oluşturmaya gerek yoktur çünkü gövde yalnızca bir ifadedir
get
Anahtar kelimeyi kullanmaya gerek yoktur, çünkü ifade gövdeli üye sözdiziminin kullanımı ile ima edilir.
Son noktayı kalınlaştırdım, çünkü şimdi cevaplayacağım asıl sorunuzla ilgili.
Arasındaki fark...
// expression-bodied member property
public int MaxHealth => x ? y:z;
Ve...
// field with field initializer
public int MaxHealth = x ? y:z;
Aradaki farkla aynı ...
public int MaxHealth
{
get
{
return x ? y:z;
}
}
Ve...
public int MaxHealth = x ? y:z;
Hangi - özellikleri anlarsanız - açık olmalıdır.
Ancak açık olmak gerekirse: ilk liste, her eriştiğinizde çağrılacak kaputun altında bir alıcıya sahip bir özelliktir. İkinci liste, alanı başlatırken ifadesi yalnızca bir kez değerlendirilen bir alan başlatıcısı olan bir alandır.
Sözdizimindeki bu fark aslında oldukça incedir ve Bill Wagner tarafından "AC # 6 gotcha: Başlatma ve İfade Bodied Üyeleri" başlıklı bir yazıda açıklanan "gotcha" ya yol açabilir. .
İfadesi vücutlu üyeleri lambda anlatım- olmakla gibi , bunlar değil lambda ifadeleri. Temel fark lambda ifadesinin bir delege örneği veya bir ifade ağacı ile sonuçlanmasıdır. İfade gövdeli üyeler, sadece sahne arkasında bir özellik oluşturmak için derleyiciye bir direktiftir. Benzerlik (az ya da çok) ok ( =>
) ile başlar ve biter .
Ayrıca ifade gövdeli üyelerin mülk üyeleriyle sınırlı olmadığını da ekleyeceğim. Tüm bu üyeler üzerinde çalışıyorlar:
- Özellikleri
- Dizinleyiciler
- Yöntemler
- Operatörler
Eklendi C # 7.0
Ancak, bu üyeler üzerinde çalışmazlar:
- İç İçe Tipler
- Etkinlikler
- Alanlar