2012-09-04 27 views
10

, C# 'in daha gelişmiş özelliklerine derinleşirken, bazı kodlara rastladım. Bu iki hat dair:Func <> delegesi ve lambda ifadesi arasındaki fark

Func<string, int> giveLength = (text => text.Length); 

ve

Func<string, int> giveLength = delegate(string text) { return text.Length; }; 

Bu aynı şekilde kullanılabilir:

Console.WriteLine(giveLength("A random string.")); 

Yani temelde .. bu iki çizgi arasındaki fark nedir? Ve bu satırlar aynı CIL’i derliyor mu?

cevap

16

Temelde aynılar. Her ikisi de # # spesifikasyon terminolojisinde anonim işlevleri'dur.

Lambda ifadeleri genellikle daha kısadır ve ayrıca işlem dışı LINQ için çok önemli olan expression trees'a dönüştürülebilir.

Anonim yöntemler, umurunda değilken parametre listesini bırakmanıza izin verir. Örneğin:

son nokta gereklidir nasıl nadiren Verilen
EventHandler handler = delegate { 
    Console.WriteLine("Sender and args don't matter"); 
}; 

, anonim yöntemleri modern C# Tehlikede olan bir türü haline gelmektedir. Lambda ifadeleri çok daha yaygındır.

+0

Teşekkürler Jon. Btw Kısa süre önce e-kitabınızı 'Depremde' C# okumaya başladım. Çok yararlı! –

+3

@memetolsen: Dezavantajlarım, eğer buradaki cevaplarımı okuyorsanız, kitabın içeriğinin çoğunu okuyacaksınız;) –

+2

bence cevapların 1/3'ü cevaplarınızda. Ama yine de, boş zamanlarımda 22,284 cevap okumak yerine kitabı okumayı tercih ederim :) –

6

Temel olarak .. Bu iki satırın farkı nedir? Ve bu satırlar aynı CIL’i derliyor mu?

Aynı şeyi yazmanın yalnızca iki farklı yolu vardır. Lambda sözdizimi daha yeni ve daha özlüdür, fakat aynı şeyi yaparlar (bu durumda).

Lambdaların (=> sözdizimi) Expression Lambdas'u oluşturmak için de kullanılabileceğini unutmayın, burada bir temsilci yerine Expression Tree yapın. LINQ to Objects (Func<T, TResult> gibi delegelere dayanan) veya LINQ to Entities (IQueryable<T> ve expression ağaçları kullanan) öğelerini kullandığınız için aynı sözdizimini kullanabilirsiniz.

+0

Cevabınız için teşekkürler! –