Kompilering og udførelse af expressions
Omdan expression trees til kørbare delegates.
Kompilering og udførelse af expressions er en gratis C# Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C# Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C# Academy-kurset indeholder 4 lektioner i alt.
Fra træ til delegat
Et udtrykstræ er data, indtil du kompilerer det. Expression<TDelegate>.Compile() omdanner træet til en rigtig delegat, du kan kalde.
using System;
using System.Linq.Expressions;
Expression<Func<int, int>> tree = x => x + 1;
Func<int, int> fn = tree.Compile();
Console.WriteLine(fn(5)); // 6Kompilering af et håndbygget træ
Træer, som du opbygger manuelt, kompileres på samme måde og producerer en fungerende delegat.
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var body = Expression.Multiply(x, Expression.Constant(3));
var lambda = Expression.Lambda<Func<int, int>>(body, x);
var fn = lambda.Compile();
Console.WriteLine(fn(4)); // 12Kald af resultatet
Den kompilerede delegat fungerer som alle andre: kald den, gem den, og giv den videre.
using System;
using System.Linq.Expressions;
Expression<Func<int, int, int>> addExpr = (a, b) => a + b;
var add = addExpr.Compile();
Console.WriteLine(add(2, 3)); // 5
Console.WriteLine(add(10, 20)); // 30Kompilering er ikke gratis
Kompilering har en omkostning ved kørsel, så gem den resulterende delegat i cache og genbrug den i stedet for at kompilere ved hvert kald.
using System;
using System.Linq.Expressions;
Expression<Func<int, int>> tree = x => x * x;
var square = tree.Compile(); // compile once
for (int i = 1; i <= 3; i++)
Console.Write(square(i) + " "); // 1 4 9
Console.WriteLine();Dynamisk opbygning af prædikater
En almindelig anvendelse er at opbygge filterprædikater ved kørsel ud fra brugerinput og derefter kompilere dem til en Func.
using System;
using System.Linq.Expressions;
var n = Expression.Parameter(typeof(int), "n");
var isPositive = Expression.GreaterThan(n, Expression.Constant(0));
var pred = Expression.Lambda<Func<int, bool>>(isPositive, n).Compile();
Console.WriteLine(pred(5)); // True
Console.WriteLine(pred(-2)); // FalseKombinering af betingelser
Brug Expression.AndAlso / OrElse til at kombinere prædikater, før du kompilerer dem.
using System;
using System.Linq.Expressions;
var n = Expression.Parameter(typeof(int), "n");
var inRange = Expression.AndAlso(
Expression.GreaterThanOrEqual(n, Expression.Constant(1)),
Expression.LessThanOrEqual(n, Expression.Constant(10)));
var fn = Expression.Lambda<Func<int, bool>>(inRange, n).Compile();
Console.WriteLine(fn(5) + " " + fn(11)); // True FalseKompilering af beregninger
Du kan sammensætte aritmetiske formler ved kørsel, hvilket er nyttigt til regelmotorer og beregnere.
using System;
using System.Linq.Expressions;
var p = Expression.Parameter(typeof(double), "p");
// price * 1.2 (add 20% tax)
var withTax = Expression.Multiply(p, Expression.Constant(1.2));
var calc = Expression.Lambda<Func<double, double>>(withTax, p).Compile();
Console.WriteLine(calc(100)); // 120DynamicInvoke til lambdaudtryk uden type
Hvis du brugte en ikke-generisk Expression.Lambda, skal du kompilere til en Delegate og kalde DynamicInvoke.
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var body = Expression.Add(x, Expression.Constant(10));
Delegate d = Expression.Lambda(body, x).Compile();
Console.WriteLine(d.DynamicInvoke(5)); // 15Bemærkning om ydeevne
Et kompileret udtryk kører omtrent lige så hurtigt som en delegat efter kompileringen den første gang. På ydeevnekritiske kodeveje skal du kompilere én gang ved opstart og gemme delegaten.
using System;
using System.Linq.Expressions;
Expression<Func<int, int>> tree = x => x + x;
var doubler = tree.Compile();
int total = 0;
for (int i = 0; i < 5; i++) total += doubler(i);
Console.WriteLine(total); // 0+2+4+6+8 = 20Fejl viser sig ved kompilering
Hvis træet er fejlformet, for eksempel hvis en parameter mangler, udløser Compile() en undtagelse. Validér derfor træer, før du er afhængig af dem.
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var y = Expression.Parameter(typeof(int), "y");
try {
// body references y but lambda only declares x
var lambda = Expression.Lambda<Func<int, int>>(Expression.Add(x, y), x);
lambda.Compile();
} catch (InvalidOperationException) {
Console.WriteLine("unbound parameter");
}Samlet eksempel
Opbyg, kompilér og kør en lille formel i ét samlet forløb.
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var formula = Expression.Add(
Expression.Multiply(x, Expression.Constant(2)),
Expression.Constant(3)); // 2x + 3
var fn = Expression.Lambda<Func<int, int>>(formula, x).Compile();
Console.WriteLine(fn(4)); // 11Hurtig kontrol
Bekræft, hvordan du kører et udtrykstræ.
Opsamling
Du har lært at kompilere og køre udtrykstræer.
Compile()omdanner et træ til en delegat, der kan kaldes.- Gem delegaten i cache; kompilering har en engangsomkostning.
- Opbyg prædikater og formler dynamisk, og kompilér dem derefter.
- Fejlformede træer udløser en undtagelse ved
Compile().
Lær C# med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 93
- Lektioner
- 346
Ofte stillede spørgsmål
Er lektionen “Kompilering og udførelse af expressions” gratis?
Ja — hele teksten til “Kompilering og udførelse af expressions” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C# Academy-kurset, skal du opgradere til CoddyKit PRO. C# Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Kompilering og udførelse af expressions”?
Omdan expression trees til kørbare delegates. Du øver dig i C# Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på C# Academy?
Der kræves ingen tidligere erfaring. C# Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Kompilering og udførelse af expressions”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne C# Academy-lektion?
Ja. Alle C# Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Hvad er expression trees
- Manuel opbygning af expressions
- Kompilering og udførelse af expressions
- Expression trees i LINQ-providers