最近在学习委托与事件的时候,自己写了个很简单的Demo,代码如下:namespace ConsoleApplication1
{
    public class EventClass   //事件触发
    {
        public delegate void MyHandler();
        public event MyHandler MyEvent;
        public void Run()
        {
            if (MyEvent != null)
                MyEvent();
        }
    }    public class ReceiverClass//事件接收
    {
        public ReceiverClass(EventClass c)
        {
            c.MyEvent += new EventClass.MyHandler(c_MyEvent);
        }        public void c_MyEvent()//事件处理程序
        {
            Console.WriteLine("Received!");
        }
    }    public class Program
    {
        static void Main(string[] args)
        {
            EventClass c = new EventClass();
            ReceiverClass r = new ReceiverClass(c);
            c.Run();
            Console.ReadLine();
        }
    }
}运行结果: "Received!".现在的疑问是:
事件接收的类一定要用构造函数来订阅事件吗?
于是我写了一个方法:
    public class ReceiverClass
    {
        EventClass c = new EventClass();
        public void MyReceiver()
        {
            c.MyEvent+=new EventClass.MyHandler(c_MyEvent);
        }  
    }
    public class Program
    {
        static void Main(string[] args)
        {
            EventClass c = new EventClass();
            ReceiverClass r = new ReceiverClass();
            r.MyReceiver();  //增加
            c.Run();
            Console.ReadLine();
        }
    }
大家看看为什么运行结果不能显示"Received!"呢?

解决方案 »

  1.   

    public class ReceiverClass
        {
            EventClass c = new EventClass();
            public void MyReceiver()
            {
                c.MyEvent+=new EventClass.MyHandler(c_MyEvent);
            } 
        }
        public class Program
        {
            static void Main(string[] args)
            {
                EventClass c = new EventClass();
                ReceiverClass r = new ReceiverClass();
                r.MyReceiver();  //增加
                c.Run();       //这里c和r没有任何关系,如何run呢? 改成r.c.Run()
                Console.ReadLine();
            }
        } 
      

  2.   

    因为你订阅事件的哪个EventClass类的实例c 和触发事件的EventClass类的实例c 不是同一个对象
    当然不可能输出你想要的结果了
      

  3.   

    关键是你订阅事件的哪个EventClass类的实例c 和触发事件的EventClass类的实例c 不是同一个对象,可以考虑将c作为参数传递过去,代码如下:
      

  4.   

        public class ReceiverClass //事件接收 
        { 
           // EventClass c = new EventClass();
            public void MyReceiver(EventClass c) 
            { 
                c.MyEvent+=new EventClass.MyHandler(c_MyEvent); 
            }
            public void c_MyEvent()//事件处理程序 
            {
                Console.WriteLine("Received!");
            }     } 
        public class Program 
        { 
            static void Main(string[] args) 
            { 
                EventClass c = new EventClass(); 
                ReceiverClass r = new ReceiverClass(); 
                r.MyReceiver(c);  //增加 
                  c.Run(); 
                Console.ReadLine(); 
            } 
        } 
      

  5.   

    二楼正解
    ReceiverClass r = new ReceiverClass(); 
    r.MyReceiver();  //增加 
    r.c.run();       
      

  6.   

    一楼的思路也是对的,只需要在ReceiverClass 中的成员变量EventClass c = new EventClass(); 前面加上public,允许在其它类访问即可.