C # ผู้รับมอบสิทธิ์ (ผู้แทน)
C # เงินต้น (ผู้แทน) คล้ายกับ C หรือ C ++ ชี้ฟังก์ชันหลัก (ผู้แทน) มีวิธีสำหรับชนิดอ้างอิงอ้างอิงตัวแปรอ้างอิงสามารถเปลี่ยนแปลงที่รันไทม์
หลัก (ผู้แทน) ตั้งใจเฉพาะสำหรับเหตุการณ์ที่เกิดขึ้นและวิธีการติดต่อกลับ ทั้งหมดของผู้ร่วมประชุม (Delegate)จะได้มาจากการ System.Delegate คลาส
คณะกรรมาธิการงบ (ผู้แทน)
ใบมอบฉันทะกำหนดวิธีการที่อาจจะถูกอ้างอิงโดยผู้ร่วมประชุม ผู้แทนสามารถชี้ไปที่วิธีการที่มีป้ายกำกับเดียวกัน
ตัวอย่างเช่นสมมติว่าคุณมีตัวแทน:
ผู้ร่วมประชุม int สาธารณะ MyDelegate (String s)
คณะกรรมการดังกล่าวข้างต้นอาจจะถูกใช้ในการอ้างถึงวิธีการใด ๆที่ใช้พารามิเตอร์สายเดียวและส่งกลับตัวแปรชนิดint
ไวยากรณ์สำหรับการประกาศรับหน้าที่ดังต่อไปนี้:
ผู้รับมอบสิทธิ์ <กลับประเภท> <ผู้รับมอบสิทธิ์ชื่อ> <รายการพารามิเตอร์>
ตัวอย่างของคณะกรรมการ (ผู้แทน)
เมื่อประกาศประเภทตัวแทนวัตถุผู้รับมอบต้องใช้คำหลักใหม่ในการสร้างและมีวิธีการโดยเฉพาะอย่างยิ่งเมื่อคุณสร้างพารามิเตอร์ตัวแทนส่งผ่านไปยังคำสั่งใหม่เป็นสายวิธีเช่นการเขียน แต่ไม่มีข้อโต้แย้ง ตัวอย่างเช่น:
ผู้ร่วมประชุมโมฆะสาธารณะ printString (String s) ... printString PS1 = printString ใหม่ (WriteToScreen); printString PS2 = printString ใหม่ (WriteToFile);
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงคำสั่งของคณะกรรมาธิการยกตัวอย่างและการใช้งานของผู้ร่วมประชุมสามารถนำมาใช้เพื่อการอ้างอิงด้วยวิธีการโต้เถียงจำนวนเต็มและส่งกลับค่าจำนวนเต็ม
การใช้ระบบ มอบหมาย int NumberChanger (int n); DelegateAppl namespace { ระดับ TestDelegate { int NUM คงที่ = 10; สาธารณะคง int AddNum (int P) { NUM + = p; กลับ NUM; } สาธารณะคง int MultNum (int Q) { NUM * = Q; กลับ NUM; } int สาธารณะคง getNum () { กลับ NUM; } เป็นโมฆะคง main (String args []) { // สร้างตัวอย่างผู้รับมอบสิทธิ์ NumberChanger NC1 = ใหม่ NumberChanger (AddNum); NumberChanger NC2 = ใหม่ NumberChanger (MultNum); // วิธีการเรียกใช้ NC1 ผู้รับมอบวัตถุ (25); Console.WriteLine ( "ค่าของ Num: {0}" getNum ()); NC2 (5) Console.WriteLine ( "ค่าของ Num: {0}" getNum ()); Console.ReadKey (); } } }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
ค่าของ Num: 35 ค่าของ Num: 175
นาย multicast (Multicasting ของผู้แทน)
วัตถุผู้แทนสามารถใช้ประกอบการ "+" ที่จะผสาน ผู้รับมอบสิทธิ์ที่จะเรียกมันผสานผสานสองได้รับมอบหมาย เพียงชนิดเดียวกันของความไว้วางใจสามารถนำมารวมกัน "-" ผู้ประกอบการสามารถนำมาใช้ในการลบองค์ประกอบจากตัวแทนผู้รับมอบสิทธิ์รวม
ใช้คุณสมบัติที่มีประโยชน์นี้นายคุณสามารถสร้างรายชื่อของตัวแทนเรียกวิธีเมื่อมันถูกเรียกว่าจะก่อให้เกิด นี้เรียกว่าได้รับมอบหมายmulticast (multicasting) ยังเป็นที่รู้จักกันในนาม multicastingโปรแกรมต่อไปนี้แสดงให้เห็นถึงตัวแทนหลายผู้รับ:
การใช้ระบบ มอบหมาย int NumberChanger (int n); DelegateAppl namespace { ระดับ TestDelegate { int NUM คงที่ = 10; สาธารณะคง int AddNum (int P) { NUM + = p; กลับ NUM; } สาธารณะคง int MultNum (int Q) { NUM * = Q; กลับ NUM; } int สาธารณะคง getNum () { กลับ NUM; } เป็นโมฆะคง main (String args []) { // สร้างตัวอย่างผู้รับมอบสิทธิ์ NumberChanger NC; NumberChanger NC1 = ใหม่ NumberChanger (AddNum); NumberChanger NC2 = ใหม่ NumberChanger (MultNum); NC = NC1; NC + = NC2; // โทร NC multicast (5) Console.WriteLine ( "ค่าของ Num: {0}" getNum ()); Console.ReadKey (); } } }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
ค่าของ Num: 75
หลัก (ผู้แทน) ใช้
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้งานของคณะผู้แทนprintStringหลักจะใช้ในการอ้างอิงวิธีการกับสตริงเป็น input และไม่กลับอะไร
เราใช้ผู้รับมอบสิทธิ์นี้จะเรียกทั้งสองวิธีสตริงแรกที่พิมพ์ไปยังคอนโซลและสตริงที่สองที่จะพิมพ์ไปยังไฟล์:
การใช้ระบบ โดยใช้ System.IO; DelegateAppl namespace { ระดับ PrintString { FS FileStream คง; SW StreamWriter คง; // ใบมอบฉันทะของผู้ร่วมประชุมโมฆะสาธารณะ printString (String s) // วิธีนี้พิมพ์ไปยังคอนโซลสาธารณะ WriteToScreen โมฆะคงที่ (สตริง STR) { Console.WriteLine ( "สตริง: {0}", STR); } // วิธีนี้พิมพ์ไปยังแฟ้มประชาชนเป็นโมฆะคง WriteToFile (String s) { FS = FileStream ใหม่ ( "C: \\ message.txt" FileMode.Append, FileAccess.Write); SW = StreamWriter ใหม่ (FS); sw.WriteLine (s); sw.Flush (); sw.Close (); fs.Close (); } // วิธีนี้ผู้ร่วมประชุมเป็นพารามิเตอร์และใช้มันเพื่อเรียกวิธีประชาชนเป็นโมฆะคง sendString (printString PS) { PS ( "Hello World"); } เป็นโมฆะคง main (String args []) { printString PS1 = printString ใหม่ (WriteToScreen); printString PS2 = printString ใหม่ (WriteToFile); sendString (PS1); sendString (PS2); Console.ReadKey (); } } }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
สตริง: Hello World