Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
İfade Ağacı, kodu tanımlayan bir veri yapısıdır. İfade ağaçları, derleyicinin kodu analiz etmek ve derlenmiş çıkışı oluşturmak için kullandığı yapıları temel alır. Bu makaleyi okurken İfade Ağaçları ile Roslyn API'lerinde Çözümleyiciler ve Kod Düzeltmeleri oluşturmak için kullanılan türler arasında oldukça benzerlik olduğunu fark edeceksiniz. (Çözümleyiciler ve Kod Düzeltmeleri, kod üzerinde statik analiz gerçekleştiren ve bir geliştirici için olası düzeltmeler öneren NuGet paketleridir.) Kavramlar benzerdir ve sonuç, kaynak kodun anlamlı bir şekilde incelenmesine olanak tanıyan bir veri yapısıdır. Ancak İfade Ağaçları, Roslyn API'lerinden farklı bir sınıf ve API kümesini temel alır. Kod satırı aşağıdadır:
var sum = 1 + 2;
Yukarıdaki kodu bir ifade ağacı olarak analiz ederseniz, ağaç birkaç düğüm içerir. En dıştaki düğüm, ataması olan bir değişken bildirim deyimidir (var sum = 1 + 2;) En dıştaki düğüm birkaç alt düğüm içerir: değişken bildirimi, atama işleci ve eşittir işaretinin sağ tarafını temsil eden bir ifade. Bu ifade, toplama işlemini temsil eden ifadelere ve toplamanın sol ve sağ işleçlerine daha fazla alt bölünür.
Eşittir işaretinin sağ tarafını oluşturan ifadelerde biraz daha detaya gidelim. ifadesi, ikili bir ifadedir 1 + 2. Daha açık belirtmek gerekirse, ikili ekleme ifadesidir. İkili toplama ifadesinin, ekleme ifadesinin sol ve sağ düğümlerini temsil eden iki alt öğe vardır. Burada her iki düğüm de sabit ifadelerdir: Sol işlenen 1 değeridir ve sağ işlenen 2 değeridir.
Görsel olarak deyimin tamamı bir ağaçtır: Kök düğümden başlayabilir ve deyimi oluşturan kodu görmek için ağaçtaki her düğüme gidebilirsiniz:
- Atamalı değişken bildirim deyimi (
var sum = 1 + 2;)- Örtük değişken türü bildirimi (
var sum)- Gizli var anahtar sözcüğü (
var) - Değişken adı bildirimi (
sum)
- Gizli var anahtar sözcüğü (
- Atama işleci (
=) - İkili ekleme ifadesi (
1 + 2)- Sol işlenen (
1) - Toplama işleci (
+) - Sağ işlenen (
2)
- Sol işlenen (
- Örtük değişken türü bildirimi (
Yukarıdaki ağaç karmaşık görünebilir, ancak çok güçlü bir ağaçtır. Aynı işlemi izleyerek çok daha karmaşık ifadeleri ayrıştırabilirsiniz. Şu ifadeyi göz önünde bulundurun:
var finalAnswer = this.SecretSauceFunction(
currentState.createInterimResult(), currentState.createSecondValue(1, 2),
decisionServer.considerFinalOptions("hello")) +
MoreSecretSauce('A', DateTime.Now, true);
Yukarıdaki ifade ayrıca ataması olan bir değişken bildirimidir. Bu örnekte, atamanın sağ tarafı çok daha karmaşık bir ağaçtır. Sen bu ifadeyi ayrıştırmayacaksın, ancak farklı düğümlerin ne olabileceğini göz önünde bulundurun. Geçerli nesneyi alıcı olarak kullanan yöntem çağrıları vardır; bunlardan biri açık this alıcısına sahiptir, diğeri ise alıcıya sahip değildir. Diğer alıcı nesneleri kullanan yöntem çağrıları vardır, farklı türlerde sabit bağımsız değişkenler vardır. Son olarak, ikili ekleme işleci vardır.
SecretSauceFunction() veya MoreSecretSauce() dönüş türüne bağlı olarak, bu ikili toplama işleci, geçersiz kılınmış bir toplama işlecine yapılan bir yöntem çağrısı olabilir ve bir sınıf için tanımlı ikili toplama işlecine yönlendirilen statik bir yöntem çağrısına dönüşebilir.
Bu algılanan karmaşıklık rağmen, önceki ifade ilk örnek kadar kolay gezinilen bir ağaç yapısı oluşturur. İfadedeki yaprak düğümleri bulmak için çocuk düğümleri dolaşmaya devam edin. Ana düğümlerin çocuklarına başvuruları vardır ve her düğümün ne tür bir düğüm olduğunu açıklayan bir özelliği vardır.
İfade ağacının yapısı çok tutarlıdır. Temel bilgileri öğrendikte, bir ifade ağacı olarak temsil edildiğinde en karmaşık kodu bile anlarsınız. Veri yapısındaki zarafet, C# derleyicisinin en karmaşık C# programlarını nasıl analiz ettiğini ve bu karmaşık kaynak kodundan doğru çıkışı nasıl oluşturduğunu açıklar.
İfade ağaçlarının yapısı hakkında bilgi edindikten sonra, edindiğiniz bilgilerin çok daha gelişmiş senaryolarla çalışmanıza hızlı bir şekilde olanak sağladığını fark ettiniz. İfade ağaçlarının inanılmaz bir gücü vardır.
İfade ağaçları, diğer ortamlarda yürütülecek algoritmaları çevirmeye ek olarak, kodu yürütmeden önce inceleyen algoritmalar yazmayı kolaylaştırır. Bağımsız değişkenleri ifade olan bir yöntem yazar ve kodu yürütmeden önce bu ifadeleri incelersiniz. İfade Ağacı kodun tam bir gösterimidir: herhangi bir alt ifadenin değerlerini görürsünüz. Yöntem ve özellik adlarını görürsünüz. Herhangi bir sabit ifadenin değerini görürsünüz. Bir ifade ağacını yürütülebilir bir temsilciye dönüştürüp kodu çalıştırırsınız.
İfade Ağaçları API'leri, hemen hemen tüm geçerli kod yapılarını temsil eden ağaçlar oluşturmanıza olanak tanır. Ancak, işleri olabildiğince basit tutmak için, ifade ağacında bazı C# deyimleri oluşturulamaz. Buna örnek olarak zaman uyumsuz ifadeler (async ve await anahtar sözcüklerini kullanma) örnektir. Gereksinimleriniz zaman uyumsuz algoritmalar gerektiriyorsa, derleyici desteğine güvenmek yerine Task nesnelerini doğrudan işlemelisiniz. Bir diğeri de döngü oluşturma işlemidir. Normalde, bu döngüleri , forveya foreachwhile döngülerini kullanarak dooluşturursunuz.
Bu serinin devamında gördüğünüz gibi, ifade ağaçlarının API'leri tek bir döngü ifadesini break ve continue döngünün yinelendiğini denetleyen ifadeleri destekler.
İfade ağacını değiştiremeyeceğiniz tek şeydir. İfade Ağaçları sabit veri yapılarıdır. İfade ağacını değiştirmek istiyorsanız, özgün ağacın bir kopyası olan ancak istediğiniz değişikliklerle yeni bir ağaç oluşturmanız gerekir.