Vad är uttrycksträd
Förstå kod som representeras som en datastruktur.
Vad är uttrycksträd är en gratis lektion i C# Academy på CoddyKit. Detta är lektion 1 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C# Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C# Academy innehåller totalt 4 lektioner.
Kod som data
Ett uttrycksträd representerar kod som en datastruktur som ni kan inspektera vid körning, i stället för som kompilerade instruktioner som ni bara kan köra. C# modellerar detta med Expression<TDelegate>.
Lambda till en delegat eller ett träd
Om ni tilldelar en lambda till en Func<...> får ni körbar kod. Om ni tilldelar samma lambda till Expression<Func<...>> bygger kompilatorn ett träd som beskriver den.
using System;
using System.Linq.Expressions;
Func<int, int> runnable = x => x + 1; // compiled delegate
Expression<Func<int, int>> tree = x => x + 1; // data structure
Console.WriteLine(runnable(5)); // 6
Console.WriteLine(tree); // x => (x + 1)Inspektera trädet
Eftersom det är data kan ni läsa delarna i ett uttrycksträd: dess parametrar, kropp och nodtyp.
using System;
using System.Linq.Expressions;
Expression<Func<int, int>> tree = x => x + 1;
Console.WriteLine(tree.Parameters[0].Name); // x
Console.WriteLine(tree.Body.NodeType); // Add
Console.WriteLine(tree.ReturnType); // System.Int32Uttrycksträdets hierarki
Varje nod ärver från System.Linq.Expressions.Expression. Vanliga typer är BinaryExpression, ParameterExpression, ConstantExpression och MethodCallExpression.
using System;
using System.Linq.Expressions;
Expression<Func<int, int>> tree = x => x + 1;
var body = (BinaryExpression)tree.Body;
Console.WriteLine(body.Left); // x
Console.WriteLine(body.Right); // 1Endast lambda-uttryck tillåts
Ni kan bara omvandla en lambda med ett enda uttryck till ett träd. Lambdor med satsblock (klamrar) kan inte vara uttrycksträd.
using System;
using System.Linq.Expressions;
Expression<Func<int, int>> ok = x => x * 2; // fine
// Expression<Func<int,int>> bad = x => { return x*2; }; // compile error
Console.WriteLine(ok); // x => (x * 2)Varför det är viktigt
Uttrycksträd gör att bibliotek kan förstå er kod i stället för att bara köra den. LINQ-providers översätter dem till SQL, dynamiska frågor eller andra mål.
NodeType anger operationen
Egenskapen NodeType är ett enum-värde av typen ExpressionType som identifierar operationen i noden.
using System;
using System.Linq.Expressions;
Expression<Func<int, bool>> tree = x => x > 10;
Console.WriteLine(tree.Body.NodeType); // GreaterThanKonstanter och parametrar
En ParameterExpression representerar ett indata, medan en ConstantExpression innehåller ett literalvärde som bäddats in i koden.
using System;
using System.Linq.Expressions;
Expression<Func<int, int>> tree = x => x + 5;
var body = (BinaryExpression)tree.Body;
Console.WriteLine(body.Left.GetType().Name); // ParameterExpression (or TypedParameterExpression)
Console.WriteLine(((ConstantExpression)body.Right).Value); // 5Metodanrop i träd
En lambda som anropar en metod blir en MethodCallExpression som visar metoden och dess argument.
using System;
using System.Linq.Expressions;
Expression<Func<string, int>> tree = s => s.Length;
// member access here; a call example:
Expression<Func<string, string>> call = s => s.ToUpper();
var mc = (MethodCallExpression)call.Body;
Console.WriteLine(mc.Method.Name); // ToUpperTräd är oföränderliga
Uttrycksträd är oföränderliga. För att ”ändra” ett träd bygger ni ett nytt träd utifrån dess delar, vilket är så visitors och omskrivare fungerar.
Sätta ihop allt
Här undersöker vi ett litet predikat-träd från början till slut: parameter, operator och konstant.
using System;
using System.Linq.Expressions;
Expression<Func<int, bool>> isAdult = age => age >= 18;
var body = (BinaryExpression)isAdult.Body;
Console.WriteLine(isAdult.Parameters[0].Name); // age
Console.WriteLine(body.NodeType); // GreaterThanOrEqual
Console.WriteLine(((ConstantExpression)body.Right).Value); // 18Snabbtest
Bekräfta vad som gör ett uttrycksträd speciellt.
Sammanfattning
Ni har lärt er vad uttrycksträd är.
Expression<TDelegate>representerar kod som inspekterbar data.- Noder omfattar parametrar, konstanter, binära operatorer och metodanrop.
- Endast lambdor med ett enda uttryck kan användas.
- Träd är oföränderliga; omskrivning skapar nya träd.
Lär dig C# med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 93
- Lektioner
- 346
Vanliga frågor
Är lektionen ”Vad är uttrycksträd” gratis?
Ja – hela texten till ”Vad är uttrycksträd” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C# Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C# Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Vad är uttrycksträd”?
Förstå kod som representeras som en datastruktur. Ni övar på C# Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig C# Academy?
Du behöver inga förkunskaper. Utbildningen i C# Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.
Hur lång tid tar lektionen ”Vad är uttrycksträd”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här C# Academy-lektionen?
Ja. Varje C# Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.