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;
            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("没有任何委托关系");
            }
        }
    }
}

解决方案 »

  1.   

    还有就是这一句是不是写反了?
    c.FireInstance = new FireEventHandler(Fire1) - c.FireInstance;///这一句是不是在“-”的左右写反了?应该是 c.FireInstance-new FireEventHandler(Fire1)呢?
      

  2.   

     FireStatic += new FireEventHandler(Fire1);
                //Static 方法 FireStatic() 代理(被委托)了 Instance 方法 .Fire2()
                FireStatic = FireStatic + new FireEventHandler(new Class1().Fire2);///这种用a=a+new(b)的写法与上面a+=new b的写法可以互换么?全都一样么?
    两句完全一样。。楼主基础太差ListDelegateRelation(FireStatic);  ///为什么运行到这一句,FireStatic.ToString()的值是 ConsoleEvents2.Class1+FireEventHandler?
    FireStatic是一个事件。。事件是一种特殊的委托类型
    而static void ListDelegateRelation(FireEventHandler x)
    此处x是一个FireEventHandler类型,这就不难解释为什么x.ToString()会输出ConsoleEvents2.Class1.FireEventHandler
                FireStatic = FireStatic - new FireEventHandler(new Class1().Fire2);///这一句可以写成FireStatic -=new FireEventHandler(new Class().Fire2)么?为什么?
    完全可以,用法不一样而已
    例i=i+1;与i+=1;是一样的
      

  3.   

    FireStatic = FireStatic + new FireEventHandler(new Class1().Fire2);///这种用a=a+new(b)的写法与上面a+=new b的写法可以互换么?全都一样么?对的,上面这行代码可以写成:
    FireStatic += new FireEventHandler(new Class1().Fire2);FireStatic = FireStatic - new FireEventHandler(new Class1().Fire2);///这一句可以写成FireStatic -=new FireEventHandler(new Class().Fire2)么?为什么?这句同样的道理可以写成:
    FireStatic -= new FireEventHandler(new Class1().Fire2);
      

  4.   

    不好意思没看完就回帖了FireStatic = FireStatic + new FireEventHandler(new Class1().Fire2);这样用是错误的事件只支持+=和-=来订阅和取消事件意思是只能这样用FireStatic+=new FireEventHandler(new Class1().Fire2);
      

  5.   

    好啊,我又找一个问题了。执行后,屏幕上是ConsoleEvents2.Class1+FireEventHandler 类型的事件代理了 ConsoleEvents2.Class1 类
    的 Static 方法 Fire1
    ConsoleEvents2.Class1+FireEventHandler 类型的事件代理了 ConsoleEvents2.Class1 的
     Instance 方法 .Fire2
    ConsoleEvents2.Class1+FireEventHandler 类型的事件代理了 ConsoleEvents2.Class1 的
     Instance 方法 .Fire2
    ConsoleEvents2.Class1+FireEventHandler 类型的事件代理了 ConsoleEvents2.Class1 的
     Instance 方法 .Fire2
    ConsoleEvents2.Class1+FireEventHandler 类型的事件代理了  类的 Static 方法 Fire1
    没有任何委托关系
    为什么最后在,没有任何委托关系的前面是 “ConsoleEvents2.Class1+FireEventHandler 类型的事件代理了  类的 Static 方法 Fire1”,这里面的“ 类的Static 方法 Fire1”的名字怎么没像上面那样打印出来呢?