delegate, Action/Func, คลอสเชอร์
ส่งพฤติกรรมผ่าน delegate: ประกาศ delegate แบบกำหนดเอง ใช้ Action/Func ที่มีให้ในตัว และดูว่าแลมบ์ดาจับตัวแปรอย่างไร (คลอสเชอร์)
delegate, Action/Func, คลอสเชอร์ เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน
ภาพรวมของ Delegate
เป้าหมาย: จัดการเมธอดเสมือนข้อมูล
- กำหนดชนิด delegate
- ใช้ Action/Func
- สร้าง แลมบ์ดา
- ทำความเข้าใจ คลอเชอร์ (ตัวแปรที่ถูกจับไว้)
พื้นฐาน Delegate แบบกำหนดเอง
delegate คือพอยน์เตอร์ฟังก์ชันที่มีการตรวจสอบชนิด กำหนดเมธอดที่เข้ากันได้ แล้วเรียกใช้เหมือนฟังก์ชัน
using System;
// Custom delegate type: a method taking two ints and returning int
public delegate int Op(int x, int y);
public class Program
{
static int Add(int a, int b) { return a + b; }
static int Mul(int a, int b) { return a * b; }
public static void Main(string[] args)
{
Op f = Add; // method group conversion
Console.WriteLine(f(2, 3)); // 5
f = Mul;
Console.WriteLine(f(2, 3)); // 6
}
}
Action และ Func
Action แทนเมธอดที่ไม่ส่งคืนค่า ส่วน Func จะส่งคืนค่า ใช้กลุ่มเมธอดหรือแลมบ์ดาได้
using System;
public class Program
{
static void Log(string s) { Console.WriteLine("LOG: " + s); }
public static void Main(string[] args)
{
Action<string> a = Log; // no return
a("hello");
Func<int, int, int> sum = delegate(int x, int y) { return x + y; }; // lambda/anon method
Console.WriteLine(sum(3, 4)); // 7
// Method group to Func
Func<string, int> len = GetLen;
Console.WriteLine(len("abc")); // 3
}
static int GetLen(string s) { return s == null ? 0 : s.Length; }
}
ตัวอย่าง Closure
คลอเชอร์ จะจับตัวแปรจากขอบเขตภายนอกไว้ ตัวแปรนั้นจะมีอายุยืนยาวกว่าเมธอดที่สร้าง delegate
using System;
public class Program
{
public static void Main(string[] args)
{
int counter = 0; // captured variable (lives as long as delegate)
Action inc = delegate() { counter = counter + 1; Console.WriteLine(counter); };
inc(); // 1
inc(); // 2
Console.WriteLine("Final=" + counter); // 2
}
}
เมธอดลำดับสูง
ส่ง Func หรือ Action เข้าไปเพื่อปรับแต่งพฤติกรรม นี่เป็นพื้นฐานของ API จำนวนมาก (รวมถึง LINQ)
using System;
public class Program
{
// Apply a transform to each number and sum the results
static int SumBy(int[] xs, Func<int, int> transform)
{
int total = 0;
for (int i = 0; i < xs.Length; i++)
{
total += transform(xs[i]);
}
return total;
}
public static void Main(string[] args)
{
int[] data = new int[] { 1, 2, 3 };
int sumSquares = SumBy(data, delegate(int x) { return x * x; });
Console.WriteLine(sumSquares); // 14
}
}
เคล็ดลับเรื่อง Delegate
เคล็ดลับ:
- เลือกใช้ Action/Func ก่อน เพื่อหลีกเลี่ยงการสร้างชนิด delegate แบบกำหนดเองโดยไม่จำเป็น
- เขียนแลมบ์ดาให้สั้นและชัดเจน
- ระวัง ตัวแปรที่ถูกจับไว้ เพราะค่าอาจเปลี่ยนแปลงในภายหลัง
- ใช้กลุ่มเมธอดเมื่อมีเมธอดที่ตั้งชื่อไว้และตรงกับลายเซ็นอยู่แล้ว
ความหมายของ Func กับ Action
ทบทวน
ทบทวน: ประกาศ delegate ใช้ Action/Func และเขียน แลมบ์ดาขนาดเล็ก คลอเชอร์ช่วยให้แลมบ์ดาจับตัวแปรเฉพาะที่ไว้ จึงควรใช้อย่างระมัดระวัง
คำถามที่พบบ่อย
บทเรียน “delegate, Action/Func, คลอสเชอร์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “delegate, Action/Func, คลอสเชอร์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “delegate, Action/Func, คลอสเชอร์”
ส่งพฤติกรรมผ่าน delegate: ประกาศ delegate แบบกำหนดเอง ใช้ Action/Func ที่มีให้ในตัว และดูว่าแลมบ์ดาจับตัวแปรอย่างไร (คลอสเชอร์) คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน
บทเรียน “delegate, Action/Func, คลอสเชอร์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- delegate, Action/Func, คลอสเชอร์
- เหตุการณ์: การเผยแพร่/การสมัครรับ คีย์เวิร์ด event
- รูปแบบเหตุการณ์และข้อควรระวัง (หน่วยความจำรั่ว)