식 컴파일 및 실행
식 트리를 실행 가능한 대리자로 변환합니다.
식 컴파일 및 실행은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
트리에서 델리게이트로
식 트리는 컴파일하기 전까지 데이터입니다. Expression<TDelegate>.Compile()은 트리를 호출할 수 있는 실제 델리게이트로 변환합니다.
using System;
using System.Linq.Expressions;
Expression<Func<int, int>> tree = x => x + 1;
Func<int, int> fn = tree.Compile();
Console.WriteLine(fn(5)); // 6직접 만든 트리 컴파일하기
직접 만든 트리도 같은 방식으로 컴파일되며, 작동하는 델리게이트가 생성됩니다.
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)); // 12결과 호출하기
컴파일된 델리게이트는 다른 델리게이트와 마찬가지로 호출하거나 저장하거나 전달할 수 있습니다.
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)); // 30Compile은 무료가 아닙니다
컴파일에는 런타임 비용이 들므로 호출할 때마다 컴파일하지 말고 결과 델리게이트를 캐시하여 재사용하십시오.
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();동적으로 조건자 만들기
일반적인 사용 사례는 런타임에 사용자 입력으로부터 필터 조건자를 만든 다음 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)); // False조건 결합하기
컴파일하기 전에 Expression.AndAlso / OrElse를 사용하여 조건자를 결합하십시오.
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 False계산 컴파일하기
런타임에 산술 수식을 조립할 수 있으며, 이는 규칙 엔진과 계산기에 유용합니다.
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)); // 120형식이 지정되지 않은 람다에서 DynamicInvoke 사용하기
제네릭이 아닌 Expression.Lambda를 사용했다면 Delegate로 컴파일한 다음 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)); // 15성능 참고 사항
컴파일된 식은 한 번 컴파일한 후 대략 델리게이트와 같은 속도로 실행됩니다. 자주 실행되는 경로에서는 시작 시 한 번 컴파일하고 델리게이트를 저장하십시오.
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 = 20컴파일 시 오류 발생
트리의 형식이 잘못된 경우(예: 매개변수가 누락된 경우) Compile()에서 예외가 발생하므로, 트리에 의존하기 전에 트리를 검증하십시오.
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");
}종합하기
작은 수식을 하나의 흐름으로 만들고 컴파일한 다음 실행합니다.
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)); // 11빠른 확인
식 트리를 실행하는 방법을 확인해 보십시오.
복습
식 트리를 컴파일하고 실행하는 방법을 배웠습니다.
Compile()은 트리를 호출 가능한 델리게이트로 변환합니다.- 컴파일에는 한 번만 비용이 들므로 델리게이트를 캐시하십시오.
- 조건자와 수식을 동적으로 만든 다음 컴파일할 수 있습니다.
- 형식이 잘못된 트리는
Compile()에서 예외를 발생시킵니다.
자주 묻는 질문
“식 컴파일 및 실행” 강의는 무료인가요?
네 — “식 컴파일 및 실행” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“식 컴파일 및 실행”에서 뭘 배우나요?
식 트리를 실행 가능한 대리자로 변환합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C# Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“식 컴파일 및 실행” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 식 트리란 무엇인가
- 수동으로 식 만들기
- 식 컴파일 및 실행
- LINQ 공급자의 식 트리