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

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 ชนิดใดที่มีมาให้ในระบบและใช้แทนเมธอดที่ส่งคืนค่า

ทบทวน

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

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

  1. delegate, Action/Func, คลอสเชอร์
  2. เหตุการณ์: การเผยแพร่/การสมัครรับ คีย์เวิร์ด event
  3. รูปแบบเหตุการณ์และข้อควรระวัง (หน่วยความจำรั่ว)
← กลับไปที่ C# Academy