วิธีการทำงานกับผู้รับมอบสิทธิ์ใน C #

ผู้รับมอบสิทธิ์คือตัวชี้ฟังก์ชันชนิดปลอดภัยที่สามารถอ้างอิงวิธีการที่มีลายเซ็นเดียวกับของผู้รับมอบสิทธิ์ คุณสามารถใช้ประโยชน์จากผู้รับมอบสิทธิ์ใน C # เพื่อใช้งานเหตุการณ์และวิธีการโทรกลับ ผู้รับมอบสิทธิ์แบบหลายผู้รับคือวิธีที่สามารถชี้ไปยังวิธีการหนึ่งหรือหลายวิธีที่มีลายเซ็นเหมือนกัน

การทำความเข้าใจผู้รับมอบสิทธิ์ใน C #

โดยพื้นฐานแล้วผู้รับมอบสิทธิ์จะมีการอ้างอิงถึงวิธีการและไปยังวัตถุเป้าหมายที่ควรเรียกใช้เมธอด ผู้รับมอบสิทธิ์ใน C # คล้ายกับตัวชี้ฟังก์ชันใน C ++ แต่ผู้รับมอบสิทธิ์ C # เป็นประเภทที่ปลอดภัย คุณสามารถส่งวิธีการเป็นพารามิเตอร์ไปยังผู้รับมอบสิทธิ์เพื่อให้ผู้รับมอบสิทธิ์ชี้ไปที่เมธอด ผู้รับมอบสิทธิ์ใช้เพื่อกำหนดวิธีการโทรกลับและใช้การจัดการเหตุการณ์และจะประกาศโดยใช้คีย์เวิร์ด "ผู้รับมอบสิทธิ์" คุณสามารถประกาศผู้รับมอบสิทธิ์ที่สามารถปรากฏขึ้นเองหรือแม้กระทั่งซ้อนกันภายในชั้นเรียน

มีสามขั้นตอนในการใช้ผู้รับมอบสิทธิ์ ซึ่งรวมถึงการประกาศการสร้างอินสแตนซ์และการเรียกใช้ 

ลายเซ็นของผู้รับมอบสิทธิ์มีลักษณะดังนี้:

มอบหมายตัวระบุประเภทผลลัพธ์ ([พารามิเตอร์])

ข้อความต่อไปนี้แสดงให้เห็นว่าคุณสามารถประกาศผู้รับมอบสิทธิ์ได้อย่างไร

ตัวแทนสาธารณะเป็นโมฆะ MyDelegate (ข้อความสตริง);

ดังที่คุณเห็นในข้อความข้างต้นชื่อผู้รับมอบสิทธิ์คือ“ MyDelegate” ซึ่งมีการส่งคืนประเภท“ โมฆะ” และยอมรับวัตถุสตริงเป็นอาร์กิวเมนต์ นี่หมายความว่าผู้มอบสิทธิ์ MyDelegate สามารถชี้ไปที่วิธีการที่มีลายเซ็นเหมือนกัน นี่เป็นเพียงการประกาศ - คุณต้องสร้างอินสแตนซ์ผู้รับมอบสิทธิ์ก่อนจึงจะใช้งานได้ ข้อความที่ให้ไว้ถัดไปแสดงให้เห็นว่าคุณสามารถสร้างอินสแตนซ์ของผู้รับมอบสิทธิ์ที่ประกาศข้างต้นได้อย่างไร

MyDelegate d = MyDelegate ใหม่ (ShowText);

เมื่อคุณประกาศและสร้างอินสแตนซ์ผู้รับมอบสิทธิ์แล้วคุณสามารถเรียกใช้วิธีการที่ผู้รับมอบสิทธิ์ชี้ไปได้อย่างง่ายดาย

d ("สวัสดีชาวโลก ... ");

ในที่นี้ d คืออินสแตนซ์ของผู้รับมอบสิทธิ์

คุณยังสามารถเรียกใช้เมธอดที่อินสแตนซ์ผู้รับมอบสิทธิ์ชี้ไปโดยใช้เมธอด Invoke () บนอินสแตนซ์ผู้รับมอบสิทธิ์ดังที่แสดงด้านล่าง

d.Invoke ("สวัสดีชาวโลก ... ");

หากคุณมีวิธีที่ยอมรับตัวเลขสองตัวและต้องการเพิ่มและส่งคืนผลรวมของตัวเลขสองตัวคุณสามารถใช้ผู้รับมอบสิทธิ์เพื่อจัดเก็บค่าที่ส่งคืนของวิธีการดังที่แสดงในข้อมูลโค้ดที่ระบุด้านล่าง

ผลลัพธ์ int = d (12, 15);

นี่คือรายการรหัสที่สมบูรณ์สำหรับการอ้างอิงของคุณ

ใช้ระบบ;

เนมสเปซผู้รับมอบสิทธิ์

{

    ตัวแทนสาธารณะ int MyDelegate (int x, int y);

    โปรแกรมชั้นเรียน

    {

      ผลรวม int คงที่ (int x, int y)

        {

            กลับ x + y;

        }

        โมฆะคง Main ()

        {

            MyDelegate d = MyDelegate ใหม่ (Sum);           

            int ผลลัพธ์ = d. กระตุ้น (12, 15);

            Console.WriteLine (ผลลัพธ์);

            Console.ReadLine ();

        }

    }

ผู้รับมอบสิทธิ์ในการดำเนินการใน C #

นี่คือรายการรหัสที่สมบูรณ์

ใช้ระบบ;

เนมสเปซผู้รับมอบสิทธิ์

{

    ตัวแทนสาธารณะเป็นโมฆะ MyDelegate (ข้อความสตริง);

    โปรแกรมชั้นเรียน

    {

        โมฆะแบบคงที่สาธารณะ ShowText (ข้อความสตริง)

        {

            Console.WriteLine (ข้อความ);

        }

        โมฆะคง Main ()

        {

            MyDelegate d = MyDelegate ใหม่ (ShowText);

            d ("สวัสดีชาวโลก ... ");

            Console.ReadLine ();

        }

    }

}

โปรดทราบว่าคุณสามารถกำหนดอ็อบเจ็กต์หลายตัวให้กับอินสแตนซ์ผู้รับมอบสิทธิ์โดยใช้ตัวดำเนินการ + ซึ่งทำให้ผู้รับมอบสิทธิ์เป็นผู้รับมอบสิทธิ์แบบหลายผู้รับ คุณยังสามารถรวมอินสแตนซ์ของผู้รับมอบสิทธิ์โดยใช้วิธีการรวมแบบคงที่

รันไทม์เก็บรักษารายการ (เรียกอีกอย่างว่ารายการเรียกใช้) ภายในเพื่อดำเนินการหลายวิธี รายการรหัสต่อไปนี้แสดงวิธีที่คุณสามารถใช้วิธี Combine () เพื่อรวมอินสแตนซ์ที่มอบสิทธิ์หลาย ๆ

myDelegate d1 = myDelegate ใหม่ (Method1);

myDelegate d2 = myDelegate ใหม่ (Method2);

myDelegate multicastDelegate = (myDelegate) Delegate.Combine (d1, d2);

multicastDelegate.Invoke ();

ผู้รับมอบสิทธิ์ที่สามารถชี้ไปยังหลายวิธีเรียกว่าผู้รับมอบสิทธิ์แบบหลายผู้รับ โปรดทราบว่าอินสแตนซ์ของผู้รับมอบสิทธิ์ไม่เปลี่ยนรูป ดังนั้นเมื่อคุณรวมผู้รับมอบสิทธิ์หรือลบอินสแตนซ์ผู้รับมอบสิทธิ์หนึ่งรายการออกจากรายการอินสแตนซ์ผู้รับมอบสิทธิ์ใหม่จะถูกสร้างขึ้นเพื่อแสดงรายการเป้าหมายหรือวิธีการที่ปรับปรุงหรือใหม่ที่จะเรียกใช้

ผู้รับมอบสิทธิ์หลายผู้รับในการดำเนินการใน C #

รายการรหัสต่อไปนี้แสดงตัวแทนแบบหลายผู้รับ สังเกตการใช้งานอินสแตนซ์ผู้รับมอบสิทธิ์: ที่นี่เราได้ใช้ตัวดำเนินการ + = เพื่อกำหนดผู้ร่วมประชุมให้กับวิธีการต่างๆที่มีลายเซ็นเหมือนกัน

ใช้ระบบ;

เนมสเปซผู้รับมอบสิทธิ์

{

    ตัวแทนสาธารณะเป็นโมฆะ MyDelegate ();

    โปรแกรมชั้นเรียน

    {

        โมฆะคงที่สาธารณะ Method1 ()

        {

            Console.WriteLine ("Inside Method1 ... ");

        }

        โมฆะคงที่สาธารณะ Method2 ()

        {

            Console.WriteLine ("Inside Method2 ... ");

        }

        โมฆะคง Main ()

        {

            MyDelegate d = null;

            d + = วิธีที่ 1;

            d + = วิธีที่ 2;

            ง. วิงวอน ();

            Console.ReadLine ();

        }

    }

}

ผู้ได้รับมอบหมายเหมาะอย่างยิ่งกับการนำโปรแกรมที่ขับเคลื่อนด้วยเหตุการณ์ไปใช้ ผู้รับมอบสิทธิ์ไม่จำเป็นต้องทราบคลาสของอ็อบเจ็กต์ที่อ้างถึง สิ่งที่ต้องรู้คือลายเซ็นของวิธีการที่จะชี้ไป การใช้ผู้รับมอบสิทธิ์อย่างเหมาะสมสามารถส่งเสริมการใช้ซ้ำในโค้ดของคุณและความยืดหยุ่นในการออกแบบของคุณ คุณสามารถดูเอกสารออนไลน์ของ Microsoft สำหรับข้อมูลเพิ่มเติมเกี่ยวกับผู้รับมอบสิทธิ์