⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9-1.txt

📁 C#实验报告 C#实验报告 C#实验报告 C#实验报告 C#实验报告 C#实验报告 C#实验报告
💻 TXT
字号:
using System;
delegate void D(int x);
class C
{
   public static void M1(int i) {
      Console.WriteLine("C.M1: " + i);
   }
   public static void M2(int i) {
      Console.WriteLine("C.M2: " + i);
   }
   public void M3(int i) {
      Console.WriteLine("C.M3: " + i);
   }
}
class Test
{
   static void Main() { 
      D cd1 = new D(C.M1);
      cd1(-1);            // call M1
      D cd2 = new D(C.M2);
      cd2(-2);            // call M2
      D cd3 = cd1 + cd2;
      cd3(10);            // call M1 then M2
      cd3 += cd1;
      cd3(20);            // call M1, M2, then M1
      C c = new C();
      D cd4 = new D(c.M3);
      cd3 += cd4;
      cd3(30);            // call M1, M2, M1, then M3
      cd3 -= cd1;         // remove last M1
      cd3(40);            // call M1, M2, then M3
      cd3 -= cd4;
      cd3(50);            // call M1 then M2
      cd3 -= cd2;
      cd3(60);            // call M1
      cd3 -= cd2;         // impossible removal is benign
      cd3(60);            // call M1
      cd3 -= cd1;         // invocation list is empty so cd3 is null
      //      cd3(70);      // System.NullReferenceException thrown
      cd3 -= cd1;         // impossible removal is benign
      Console.ReadLine();
   }
}


如语句 cd3 += cd1; 中所显示,委托可以多次出现在一个调用列表中。这种情况下,它每出现一次,就会被调用一次。在这样的调用列表中,当移除委托时,实际上移除的是调用列表中最后出现的那个委托实例。

就在执行最后一条语句 cd3 -= cd1; 之前,委托 cd3 引用了一个空的调用列表。试图从空的列表中移除委托(或者从非空列表中移除表中没有的委托)不算是错误。

产生的输出为:

C.M1: -1
C.M2: -2
C.M1: 10
C.M2: 10
C.M1: 20
C.M2: 20
C.M1: 20
C.M1: 30
C.M2: 30
C.M1: 30
C.M3: 30
C.M1: 40
C.M2: 40
C.M3: 40
C.M1: 50
C.M2: 50
C.M1: 60
C.M1: 60

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -