การคอมไพล์และเรียกใช้นิพจน์
แปลงต้นไม้นิพจน์เป็นดีลีเกตที่เรียกใช้ได้
การคอมไพล์และเรียกใช้นิพจน์ เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
จากแผนผังสู่ดีลีเกต
แผนผังนิพจน์จะเป็นข้อมูลจนกว่าคุณจะ Compile มัน 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การคอมไพล์แผนผังที่สร้างด้วยตนเอง
แผนผังที่คุณสร้างด้วยตนเองจะ Compile ด้วยวิธีเดียวกัน และสร้างดีลีเกตที่ทำงานได้
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();การสร้าง predicate แบบไดนามิก
การใช้งานทั่วไปอย่างหนึ่งคือการสร้าง predicate สำหรับกรองข้อมูลขณะทำงานจากอินพุตของผู้ใช้ แล้ว Compile เป็น 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 เพื่อรวม predicate ก่อน Compile
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)); // 120DynamicInvoke สำหรับแลมบ์ดาที่ไม่มีชนิด
หากคุณใช้ Expression.Lambda ที่ไม่ใช่แบบ generic ให้ Compile เป็น 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ข้อสังเกตด้านประสิทธิภาพ
หลังการ Compile ครั้งเดียว นิพจน์ที่คอมไพล์แล้วจะทำงานด้วยความเร็วใกล้เคียงกับดีลีเกต สำหรับเส้นทางการทำงานที่ถูกเรียกบ่อย ให้ Compile ครั้งเดียวเมื่อเริ่มต้นโปรแกรมแล้วจัดเก็บดีลีเกตไว้
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
หากแผนผังมีรูปแบบไม่ถูกต้อง (เช่น ไม่มีพารามิเตอร์) 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");
}การนำแนวคิดทั้งหมดมาประกอบกัน
สร้าง Compile และเรียกใช้สูตรขนาดเล็กในขั้นตอนเดียว
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()แปลงแผนผังเป็นดีลีเกตที่เรียกใช้ได้- แคชดีลีเกตไว้ เพราะการคอมไพล์มีต้นทุนที่เกิดขึ้นครั้งเดียว
- สร้าง predicate และสูตรแบบไดนามิก แล้วจึง Compile
- แผนผังที่มีรูปแบบไม่ถูกต้องจะทำให้เกิดข้อผิดพลาดที่
Compile()
คำถามที่พบบ่อย
บทเรียน “การคอมไพล์และเรียกใช้นิพจน์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การคอมไพล์และเรียกใช้นิพจน์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การคอมไพล์และเรียกใช้นิพจน์”
แปลงต้นไม้นิพจน์เป็นดีลีเกตที่เรียกใช้ได้ คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การคอมไพล์และเรียกใช้นิพจน์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ต้นไม้นิพจน์คืออะไร
- การสร้างนิพจน์ด้วยตนเอง
- การคอมไพล์และเรียกใช้นิพจน์
- ต้นไม้นิพจน์ในผู้ให้บริการ LINQ