İfade gövdeli üyelerin kullanılması ne zaman uygundur? [kapalı]


24

C # 6, yalnızca bir ifadenin sonucunu döndüren yöntem ve özelliklerde basitleştirilmiş kod sağlayan izin ifadeli üyeler sunar:

public override string ToString()
{
     return string.Format("{0} {1}", _field1, _field2);
}

dönüşür:

public override string ToString() =>
    string.Format("{0} {1}", _field1, _field2);

Şimdi tam olarak eşdeğer ve geçerli iki sözdizimimiz olduğundan, hangisinin kullanılacağına karar vermek için bazı kuralların kullanılması gerekir. Yeni alternatif ne zaman uygun olur?


7
Umm, üyenin bedeni ne zaman bir ifadedir?
Jörg W Mittag

1
Bu, "İfade gövdeli üyeleri ne zaman kullanmak mümkün" sorusuna cevap verecektir.
Asik

7
Tamamen alakalı değil, ama kullanamaz public override string ToString() => $"{_field1} {_field2}";mısın?
Thaoden

3
@JorgWMittag buna "... yan etkisi olmayan" eklerdim. Bir yöntemi tamamen işlevsel olmadığında işlevsel bir tarzda bildirmek yanıltıcı olabilir.
Jules,

Yanıtlar:


12

İşlevsel programlama dilleri yalnızca ifadelerden oluşur, bu nedenle çoğu aslında en başından beri böyle bir özelliğe sahipti. Bunu, daha kısa, çok daha anlamlı bir adla değiştirilebilecek nispeten kısa, sık sık tekrarlanan bir ifadeye sahip olduğunuzda kullanırsınız.

Yaygın bir örnek, başka yerlerde kullanılan, örneğin:

public static bool isOdd(int num) => (num % 2) == 1;

İfade çok uzunsa, ayrı işleve veya belki de adlandırılmış ara sonuçlarla bir işleve ayırmak daha iyidir. Kısaysa, ancak iyi bir isim düşünemiyorsanız, korkunç bir isim condition1veya başka bir şey oluşturmak yerine ifadeyi kopyalamaktan daha iyidir .


21

Gönderen C # / NET Küçük Harikası:. C # 6'da İfade-Bodied Üyeleri :

Peki bunu kullanmalısın? Her şey stile düşüyor. Bağırsaklığım, bunu ilk bakışta açıkça anlaşılabilecek basit ifadeler ve ifadelerle sınırlamak olacaktır .

(vurgu, benim; aşağıdaki Güncelleme 1'e bakınız)

Yukarıdaki makalenin Özetinden daha fazlası:

Dolayısıyla C # 6 şimdi bize sadece özellik alma ve ifadeleri içeren yöntem gövdeleri belirtme yeteneği veriyor. Bu, kodunuzu daha özlü hale getirmek için çok basit yöntemlerin sözdizimi yükünü azaltmaya yardımcı olabilir.

Ancak, her şeyde, verilen herhangi bir durum için uygun olup olmadığına dair kararınızı kullanın. Bir ifade çok uzun veya karmaşık olduğunda, tüm vücut sözdizimini kullanmak yine de okunabilir olabilir.

Performansla ilgili başka bir alıntı, çünkü performans sorunları belirli bir dil özelliğini kullanmanın uygun olduğu durumlarda da oynayabilir:

Şimdi, sorabilirsiniz, bunun çalışma zamanında herhangi bir performans etkisi var mı? Aslında, cevap hayır . Bu basitçe tüm vücudu yazmakla aynı IL'ye genişleyen sözdizimsel bir şekerdir. O mu değil sadece bir ifadenin neden basit organları yazma basitleştirmek için lambda ifade sözdizimi ödünç edilir bir temsilci oluşturun.

(vurgu, yazar)

Güncelleme 1: @ JörgWMittag dedi

Bu anlamlı değil. "bunu basit ifadelerle ve ifadelerle sınırla"? Ha? İfadelerle, sadece ifadelerle bile çalışmaz!

Orijinal yazarın yanlış konuştuğu anlaşılıyor. Yeni ve Geliştirilmiş C # 6.0'dan netleştirmek için :

İfade gövdeli işlevler, C # 6.0'da başka bir sözdizimi basitleştirmesidir. Bunlar, ifade cetveli olmayan fonksiyonlardır. Bunun yerine, işlev bildirimini izleyen bir ifade ile bunları uygularsınız.

Açıkçası, bu bir İfade yöntemi veya özelliği yapmaz . İfade sözdizimini , kod satırlarını (ve küme parantezlerinin sayısını) azaltmak için kullanır .

Orijinal önerim hala geçerli: Kodunuzu açık ve anlaşılması kolay hale getirdiğinde kullanın, yalnızca kullanmanızdan değil.


2
Bu anlamlı değil. "bunu basit ifadelerle ve ifadelerle sınırla "? Ha? İfadelerle, sadece ifadelerle bile çalışmaz ! Ayrıca karışıklık eklemenin (iki parantez ve bir returnanahtar kelime) daha fazla okunabilirliğe yol açabileceğine ikna olmadım . Ne de olsa, karmaşık ifade hala sözdizimi karmaşasına gömülmüş olarak aynı karmaşık ifadedir.
Jörg W Mittag

3
Okuduklarımdan itibaren ifade bedensel üyeler aslında ifadeler değildir. Onlar sözdizimsel şeker. C # özelliği blog gönderiminden bu yana değişmediyse, geçersiz iade türleriyle yöntemleri destekliyor.
Greg Burghardt,

1
Yanılıyor olabilirim ama İfade İfadelerinde yan etkilere izin verilmediğine inanıyorum. Bu yüzden, bana göre, ifade ifadelerinin yararı, okuyucuya bu "ifadenin" saf olduğunu ve okuyucunun aramanız gereken gizli yan etkileri olmadığını söylemenizdir.
John

1
@John "izin verilmedi" tamamen yanlıştır. Bir eylem oluşturma gibi tüm shenaniganları eylemler bildirim seti üye değişkenlerinin içinde yapabilir ve eylemi çağırabilirsiniz. Bu nedenle, yan etkiler açıkça kabul edilmez. Ben onlardan kesinlikle vazgeçerdim, ifade sözdiziminin noktasını özlüyorlar.
Mafii

@Mafii. Teşekkürler. O zamandan beri, "modern" olarak tanımlanan "ifade ifadelerini" yapabileceğinizi öğrendim. Ancak bana göre, bu fikir sadece kafa karıştırıcı.
John
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.