ต้นไม้นิพจน์คืออะไร
ทำความเข้าใจโค้ดที่แสดงเป็นโครงสร้างข้อมูล
ต้นไม้นิพจน์คืออะไร เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
โค้ดในรูปข้อมูล
แผนผังนิพจน์ ใช้แทนโค้ดด้วยโครงสร้างข้อมูลที่คุณตรวจสอบได้ขณะทำงาน แทนที่จะเป็นคำสั่งที่คอมไพล์แล้วซึ่งทำได้เพียงเรียกใช้ C# จำลองแนวคิดนี้ด้วย Expression<TDelegate>
แลมบ์ดากับดีลีเกตเทียบกับแผนผัง
กำหนดแลมบ์ดาให้กับ Func<...> แล้วคุณจะได้โค้ดที่เรียกใช้ได้ แต่เมื่อกำหนดแลมบ์ดาเดียวกันให้กับ Expression<Func<...>> คอมไพเลอร์จะสร้างแผนผังที่อธิบายแลมบ์ดานั้น
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)การตรวจสอบแผนผัง
เนื่องจากแผนผังนิพจน์เป็นข้อมูล คุณจึงอ่านส่วนต่าง ๆ ของแผนผังได้ ได้แก่ พารามิเตอร์ body และชนิดของโหนด
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.Int32ลำดับชั้นของนิพจน์
ทุกโหนดสืบทอดมาจาก System.Linq.Expressions.Expression ชนิดที่พบได้บ่อย ได้แก่ BinaryExpression, ParameterExpression, ConstantExpression และ 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); // 1อนุญาตเฉพาะแลมบ์ดาแบบนิพจน์
คุณสามารถแปลงแลมบ์ดานิพจน์เดียวเป็นแผนผังได้เท่านั้น แลมบ์ดาที่มีเนื้อหาเป็นคำสั่ง (มีวงเล็บปีกกา) ไม่สามารถเป็นแผนผังนิพจน์ได้
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)เหตุผลที่เรื่องนี้สำคัญ
แผนผังนิพจน์ช่วยให้ไลบรารี เข้าใจ โค้ดของคุณ แทนที่จะเพียงเรียกใช้ LINQ provider จะแปลงแผนผังเหล่านี้เป็น SQL แบบสอบถามแบบไดนามิก หรือเป้าหมายอื่น ๆ
NodeType บอกการดำเนินการ
พร็อพเพอร์ตี NodeType เป็นค่าของ enum ExpressionType ที่ระบุการดำเนินการของโหนดนั้น
using System;
using System.Linq.Expressions;
Expression<Func<int, bool>> tree = x => x > 10;
Console.WriteLine(tree.Body.NodeType); // GreaterThanค่าคงที่และพารามิเตอร์
ParameterExpression แทนอินพุต ส่วน ConstantExpression เก็บค่าตามตัวอักษรที่ฝังอยู่ในโค้ด
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); // 5การเรียกเมธอดในแผนผัง
แลมบ์ดาที่เรียกใช้เมธอดจะกลายเป็น MethodCallExpression ซึ่งเปิดให้เข้าถึงเมธอดและอาร์กิวเมนต์ของเมธอดได้
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); // ToUpperแผนผังไม่เปลี่ยนแปลง
แผนผังนิพจน์ไม่สามารถเปลี่ยนแปลงได้ หากต้องการ "เปลี่ยนแปลง" แผนผัง คุณต้องสร้างแผนผังใหม่จากส่วนต่าง ๆ ซึ่งเป็นวิธีการทำงานของตัวเยี่ยมชมและตัวเขียนแผนผังใหม่
การนำแนวคิดทั้งหมดมาประกอบกัน
ในที่นี้เราจะตรวจสอบแผนผัง predicate ขนาดเล็กตั้งแต่ต้นจนจบ ได้แก่ พารามิเตอร์ ตัวดำเนินการ และค่าคงที่
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); // 18แบบทดสอบสั้น ๆ
ยืนยันความเข้าใจว่าอะไรทำให้แผนผังนิพจน์มีลักษณะพิเศษ
สรุปทบทวน
คุณได้เรียนรู้ว่าแผนผังนิพจน์คืออะไร
Expression<TDelegate>ใช้แทนโค้ดในรูปข้อมูลที่ตรวจสอบได้- โหนดประกอบด้วยพารามิเตอร์ ค่าคงที่ การดำเนินการแบบไบนารี และการเรียกเมธอด
- ใช้ได้เฉพาะแลมบ์ดาที่มีนิพจน์เดียว
- แผนผังไม่เปลี่ยนแปลง การเขียนใหม่จะสร้างแผนผังใหม่
คำถามที่พบบ่อย
บทเรียน “ต้นไม้นิพจน์คืออะไร” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ต้นไม้นิพจน์คืออะไร” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ต้นไม้นิพจน์คืออะไร”
ทำความเข้าใจโค้ดที่แสดงเป็นโครงสร้างข้อมูล คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “ต้นไม้นิพจน์คืออะไร” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ต้นไม้นิพจน์คืออะไร
- การสร้างนิพจน์ด้วยตนเอง
- การคอมไพล์และเรียกใช้นิพจน์
- ต้นไม้นิพจน์ในผู้ให้บริการ LINQ