2011-08-22 19 views
5

Lambda İfadesinin ne olduğunu biliyorum.İfadeler vs Lambdas

Ancak, bunun Expression ile aynı şey olup olmadığından emin değilim. Burada bildiğimden daha çok şey var gibi görünüyor.

wrapping IQueryable numaralı telefonu arıyorum ve Expressions çok kullanıyor. Öyleyse, örneğin, Lambda'da düşünülenden daha çok 'İfade' parametresi var mı?

public InterceptedQuery(InterceptingProvider provider, Expression expression) 
{ 
    this._provider = provider; 
    this._expression = expression; 
} 

cevap

4

bir lambda ifade iki şeyden biri haline, çerçeveye bağlı olarak, derlenen bir derleyici özelliğidir: buna

  • bir (gizli) fonksiyonu ve temsilci
  • bir Expression

uygulama derlenmiş sonra o tu oldu gibi bir lambda ifadesi kavramı, yok Yukarıdaki iki seçenekten birine başvurdu.

Ben 'İfade' parametresine daha bir ifade kapsüller bir Lambda

içinde düşünülebilir göre burada var sen

ile ne demek emin değilim ve uygulama mantığını ifade denetlenebilir bir biçimde (diğer bir deyişle, geliştiricinin, çağrılan özellikler ve işlevler, yazılanlar, karşılaştırmalar vb. bakımından yazdığı şeyi görebilmenizi sağlar). Bu nedenle, sorgu sağlayıcıları (çoğunlukla, Varlık Çerçevesi gibi nesne-ilişkisel eşleştiriciler) kodu alıp SQL'e dönüştürürler.

+0

+1 mükemmel cevap: usul parametresinin doğru tür bir ifade bekliyorsa

C# derleyicisi bazen bir ifade içine lambda açabilir. Üzerinde nokta !!! – gideon

1

Lambdalar genellikle Expression'un "soyut sözdizimi ağaçları" (AST), yani. kodu temsil eden bir veri yapısı ve kod olarak derlenebilir. IQueryable genel olarak İfade üzerinde çalışır çünkü AST'yi, yalnızca ana makine yerine bir SQL sunucusu gibi farklı ortamlarda çalışacak şekilde kodlaması gerekir. SQL (Linq2Sql), JavaScript, OpenGL shader (Bling) ve daha fazlası için derleyen IQueryableProviders vardır.

void Foo(Expression<Func<int>>) { ... } 
... 
Foo(() => 3); 
+0

"Lambdalar genellikle derlenmiş koddur" Bu yanlıştır, lambdalar derlenmiş kodlar oluşturmak için kullanılırken (gizli, derleyici tarafından oluşturulan işlevler için delege olurlar), ayrıca "İfade" nesnelerini oluşturmak için kullanılırlar; hangisi yaratılırsa, içerik tarafından belirlenir. AST'ye dair bilgileriniz kesinlikle doğru olduğu için reddediyorum, ancak ilk cümle, Lambdas ve İfadeler arasında bir fark olduğunu ima ediyor. –

+0

* Genel olarak * vurgulayın. Lambdaların tam ifade gücü, şu anda sadece delegeler tarafından kullanılabilir, çünkü "deyim lambdasları" ifadeleri derleyemez. İfade lambdaların fakir bir alt kümesidir. Ayrıca, lambda kullanımının çoğunluğunun, delegeleri kullanan System.Linq olduğunu tahmin ediyorum, ama belki de bu tahminde önyargılıyım. – naasking

+0

Orada katılmıyorum; LINQ ifadelerinin çoğunluğunun LINQ-to-SQL veya Entity Framework sorgularının bir parçası olduğunu düşünüyorum (diğer ORM'ler de açıkça İfade sözdizimini destekliyorlar, ancak kullanımlarının EF veya L2S kadar yüksek bir yerde olduğunu düşünmüyorum).StackOverflow ile ilgili "LINQ" sorularının ezici çoğunluğunun bu iki çerçeveden birini referans aldığını düşünüyorum (EF, çoğunluk payı olarak üstlenmeye başlıyor, ancak L2S hiç bir fahişe değil). –