0Pricing
C# Academy · บทเรียน

การคอมไพล์และเรียกใช้นิพจน์

แปลงต้นไม้นิพจน์เป็นดีลีเกตที่เรียกใช้ได้

การคอมไพล์และเรียกใช้นิพจน์ เป็นบทเรียน 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)); // 30

Compile ไม่ได้ฟรี

การคอมไพล์มีต้นทุนขณะทำงาน ดังนั้นควรแคชดีลีเกตที่ได้แล้วนำกลับมาใช้ แทนการคอมไพล์ใหม่ทุกครั้งที่เรียกใช้

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)); // 120

DynamicInvoke สำหรับแลมบ์ดาที่ไม่มีชนิด

หากคุณใช้ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ต้นไม้นิพจน์คืออะไร
  2. การสร้างนิพจน์ด้วยตนเอง
  3. การคอมไพล์และเรียกใช้นิพจน์
  4. ต้นไม้นิพจน์ในผู้ให้บริการ LINQ
← กลับไปที่ C# Academy