Aracılığıyla paylaş


İfade Ağaçları

İfade ağaçları her düğümün bir ifade olduğu, örneğin bir yöntem çağrısı veya x < y gibi ikili bir işlemin bulunduğu ağaç benzeri bir veri yapısındaki kodu temsil eder.

LINQ kullandıysanız, türlerin API setinin bir parçası olduğu zengin bir kütüphaneyle çalışma deneyiminiz vardır. (LINQ hakkında bilginiz yoksa, bundan önce LINQ öğreticisini ve lambda ifadeleri hakkındaki makaleyi okumak isteyebilirsiniz.) İfade Ağaçları, işlev olan bağımsız değişkenlerle daha zengin etkileşim sağlar.

LINQ sorguları oluştururken genellikle Lambda İfadelerini kullanarak işlev bağımsız değişkenleri yazarsınız. Tipik bir LINQ sorgusunda, bu işlevin bağımsız değişkenleri derleyici tarafından oluşturulan bir temsilciye dönüştürülür.

İfade ağaçlarını kullanan kodu zaten yazdınız. Entity Framework'un LINQ API'leri, LINQ sorgu ifade deseni için bağımsız değişkenler olarak ifade ağaçlarını kabul eder. Bu, Entity Framework'ün C# dilinde yazdığınız sorguyu veritabanı altyapısında yürütülen SQL'e çevirmesini sağlar. Bir diğer örnek de .NET için popüler bir sahte çerçeve olan Moq'tır.

Daha zengin bir etkileşime sahip olmak istediğinizde İfade Ağaçları kullanmanız gerekir. İfade Ağaçları kodu incelediğiniz, değiştirdiğiniz veya yürüttüğüniz bir yapı olarak temsil edilir. Bu araçlar size çalışma zamanında kodu işleme gücü verir. Çalışan algoritmaları inceleyen veya yeni özellikler ekleyen kodlar yazarsınız. Daha gelişmiş senaryolarda, çalışan algoritmaları değiştirir ve hatta C# ifadelerini başka bir ortamda yürütülmesi için başka bir forma çevirirsiniz.

İfade ağaçlarının temsil ettiği kodu derler ve çalıştırırsınız. İfade ağaçlarının oluşturulması ve çalıştırılması yürütülebilir kodun dinamik olarak değiştirilmesini, çeşitli veritabanlarında LINQ sorgularının yürütülmesini ve dinamik sorguların oluşturulmasını sağlar. LINQ'teki ifade ağaçları hakkında daha fazla bilgi için bkz. Dinamik sorgular oluşturmak için ifade ağaçlarını kullanma.

İfade ağaçları, dinamik diller ve .NET arasında birlikte çalışabilirlik sağlamak ve derleyici yazarlarının Microsoft ara dili (CIL) yerine ifade ağaçlarını yaymasını sağlamak için dinamik dil çalışma zamanında (DLR) de kullanılır. DLR hakkında daha fazla bilgi için bkz. Dinamik Dil Çalışma Zamanına Genel Bakış.

C# veya Visual Basic derleyicisinin anonim lambda ifadesini temel alarak sizin için bir ifade ağacı oluşturmasını sağlayabilir veya ad alanını kullanarak System.Linq.Expressions el ile ifade ağaçları oluşturabilirsiniz.

Türünde bir değişkene Expression<TDelegate>lambda ifadesi atandığında, derleyici lambda ifadesini temsil eden bir ifade ağacı oluşturmak için kod yayar.

Aşağıdaki kod örnekleri, C# derleyicisinin lambda ifadesini num => num < 5temsil eden bir ifade ağacı oluşturmasını nasıl sağladıklarını gösterir.

Expression<Func<int, bool>> lambda = num => num < 5;

Kodunuzda ifade ağaçları oluşturursunuz. Her düğümü oluşturup düğümleri bir ağaç yapısına ekleyerek ağacı oluşturursunuz. İfade ağaçları oluşturma makalesinde nasıl ifade oluşturacağınızı öğreneceksiniz.

İfade ağaçları değişmezdir. İfade ağacını değiştirmek istiyorsanız, var olan ağacı kopyalayıp içindeki düğümleri değiştirerek yeni bir ifade ağacı oluşturmanız gerekir. Var olan ifade ağacından geçiş yapmak için bir ifade ağacı ziyaretçisi kullanırsınız. Daha fazla bilgi için ifade ağaçlarını çevirme makalesine bakın.

bir ifade ağacı derledikten sonra, ifade ağacı tarafından temsil edilen kodu yürütürsiniz.

Sınırlamalar

C# derleyicisi yalnızca ifade lambdalarından (veya tek satırlı lambdalardan) ifade ağaçları oluşturur. Lambda deyimini veya çok satırlı lambdaları ayrıştıramaz. C# dilindeki lambda ifadeleri hakkında daha fazla bilgi için bkz. Lambda İfadeleri.

İfade ağaçlarını iyi çevirmeyen bazı yeni C# dil öğeleri vardır. İfade ağaçları ifadeler veya await lambda ifadeleri içeremezasync. C# 6 ve sonraki sürümlere eklenen özelliklerin çoğu ifade ağaçlarında yazıldıklarından farklı görünür. Bunun yerine, ifade ağaçlarında daha yeni özellikler mümkün olduğunda eşdeğer ve daha önceden var olan söz diziminde kullanıma sunulur. Diğer yapılar kullanılamaz. Bu, ifade ağaçlarını yorumlayan kodun yeni dil özellikleri sunulduğunda aynı şekilde çalıştığı anlamına gelir. Ancak, bu sınırlamalarla bile ifade ağaçları, veri yapısı olarak temsil edilen kodu yorumlamaya ve değiştirmeye dayanan dinamik algoritmalar oluşturmanıza olanak tanır. Entity Framework gibi zengin kitaplıkların yaptıkları işi gerçekleştirmesini sağlar.

İfade ağaçları yeni ifade düğümü türlerini desteklemez. Tüm ifade ağaçlarını yorumlayan kitaplıklar için yeni düğüm türleri eklemek, uyumsuzluk yaratacak bir değişiklik olacaktır. Aşağıdaki liste, kullanılamayabilen çoğu C# dil öğesini içerir: