using System; using System.Collections.Generic; using System.Text; namespace ConsoleEvents2 { class Class1 { //声明一个委托 delegate FireEventHandler,delegate 没有 静态或实例 成员的说法 public delegate void FireEventHandler(string s); //声明 FireEventHandler 委托类型的事件 //亦即将 FireEventHandler 理解为数据类型,易理解 public event FireEventHandler FireInstance; public static event FireEventHandler FireStatic; static void Main(string[] args) { System.Console.WriteLine("Hello World"); //用 delegate: FireEventHandler() 委托,建立委托关系 //Static 方法 FireStatic() 代理(被委托)了 Static 方法 Fire1() FireStatic += new FireEventHandler(Fire1); //Static 方法 FireStatic() 代理(被委托)了 Instance 方法 .Fire2() FireStatic = FireStatic + new FireEventHandler(new Class1().Fire2);///这种用a=a+new(b)的写法与上面a+=new b的写法可以互换么?全都一样么? Class1 c = new Class1(); //Instance 方法 .FireInstance() 代理(被委托)了 Instance 方法 .Fire2() c.FireInstance += new FireEventHandler(c.Fire2); //Instance 方法 .FireInstance() 代理(被委托)了 Static 方法 Fire1() c.FireInstance = new FireEventHandler(Fire1) + c.FireInstance; //以上仅是声明了委托关系,尚未执行 委托代理方法 ! System.Console.WriteLine("下面列印委托关系:"); System.Console.WriteLine("Static 方法 FireStatic() 作为代理接受以下委托:"); ListDelegateRelation(FireStatic); System.Console.WriteLine(); System.Console.WriteLine("Instance 方法 .FireInstance() 作为代理接受以下委托:"); ListDelegateRelation(c.FireInstance); System.Console.WriteLine("请键入任意字符(串),/"q/" 退出!"); string s; while (true) { s = System.Console.ReadLine(); System.Console.WriteLine("--------------------------"); System.Console.WriteLine("以下是键入 /"{0}/" 后,触发事件的响应:"); //我们在此编程,即:在接受屏幕行录入后,令程序执行委托代理方法! //从而触发了事件! // FireStatic 静态事件被触发了 FireStatic("FireStatic 静态事件被触发了:/nStatic 方法 FireStatic() 受委托代理执行了 {0}/n你键入了: [" + s + "]/n"); // .FireInstance 实例事件被触发了 c.FireInstance(".FireInstance 实例事件被触发了: /nInstance 方法 .FireInstance() 受委托代理执行了 {0}/n你键入了: [" + s + "]/n"); System.Console.WriteLine("======================================="); System.Console.WriteLine("请键入任意字符(串),/"q/" 退出!"); if (s == "q") break; } ///* //解除委托关系可用 "-=" //下面解除委托,列印剩余委托关系 ListDelegateRelation(FireStatic); ///为什么运行到这一句,FireStatic.ToString()的值是 ConsoleEvents2.Class1+FireEventHandler? FireStatic -= new FireEventHandler(Fire1); ListDelegateRelation(FireStatic); FireStatic = FireStatic - new FireEventHandler(new Class1().Fire2);///这一句可以写成FireStatic -=new FireEventHandler(new Class().Fire2)么?为什么? ListDelegateRelation(FireStatic); c.FireInstance = new FireEventHandler(Fire1) - c.FireInstance;///这一句是不是在“-”的左右写反了?应该是 c.FireInstance-new FireEventHandler(Fire1)呢? ListDelegateRelation(c.FireInstance); c.FireInstance = c.FireInstance - new FireEventHandler(Fire1); ListDelegateRelation(c.FireInstance); //*/ Console.Read(); } //静态方法 static void Fire1(string s) { //响应事件的程序 System.Console.WriteLine(s.Replace("{0}", "static 方法 Fire1()")); } //实例方法 void Fire2(string s) { //响应事件的程序 System.Console.WriteLine(s.Replace("{0}", "Instance 方法 .Fire2()")); } static void ListDelegateRelation(FireEventHandler x) { if (x != null) { // foreach (System.Delegate d in x.GetInvocationList()) foreach (FireEventHandler d in x.GetInvocationList()) { System.Console.WriteLine(x.ToString() + " 类型的事件代理了 " + (d.Method.IsStatic ? x.Target + " 类的 Static 方法 " : d.Target + " 的 Instance 方法 .") + d.Method.Name); } } else { System.Console.WriteLine("没有任何委托关系"); } } } }