文件Connection.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;namespace Ch13Ex02
{
    public delegate void MessageHandler(string messageText);
    public class Connection
    {
        public event MessageHandler MessageArrived;
        private Timer pollTimer;
        public Connection()
        {
            pollTimer = new Timer(100);
            pollTimer.Elapsed += new ElapsedEventHandler(CheckForMessage);
        }
        public void Connect()
        {
            pollTimer.Start();
        }
        public void Disconnect()
        {
            pollTimer.Stop();
        }
        private static Random random = new Random();
        private void CheckForMessage(object source, ElapsedEventArgs e)
        {
            Console.WriteLine("Checking for new mesages.");
            if ((random.Next(9) == 0) && (MessageArrived != null))
            {
                MessageArrived("Hello Mum!");
            }
        }
    }}
文件Display:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace Ch13Ex02
{
    public class Display
    {
        public void DisplayMessage(string message)
        {
            Console.WriteLine("Message arrived:{0}", message);
        }
    }
}
文件:Program.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace Ch13Ex02
{
    class Program
    {
        static void Main(string[] args)
        {
            Connection myConnection = new Connection();
            Display myDisplay = new Display();
            myConnection.MessageArrived += new MessageHandler(myDisplay.DisplayMessage);
            myConnection.Connect();
            Console.ReadKey();
        }
    }
}
我不知道当Program中创建一个Connection的对象之后Connection类if ((random.Next(9) == 0) && (MessageArrived != null))中的MessageArrived是怎么判断是否是空值的,请教各位

解决方案 »

  1.   

    myConnection.MessageArrived += new MessageHandler(myDisplay.DisplayMessage); 
    这句话就会在MessageArrived事件列表中添加一个事件处理函数,即myDisplay中的DisplayMessage事件。事实上,并不是所有的调用方都必须对事件进行订阅,也就是说,myConnection.MessageArrived += new MessageHandler(myDisplay.DisplayMessage); 这句话可有可无。那么在没有这句话的时候,也就是调用方并没有去订阅事件,那么MessageArrived事件列表中没有事件处理函数,也就为空了。因此,在使用MessageArrived之前必须判断其是否为空。楼主可以参考一下这篇文章:
    http://www.sunnychen.org/chinese/article.asp?id=17
      

  2.   


     if ((random.Next(9) == 0) && (MessageArrived != null)) 

        if(MessageArrived!=null)//这里就是判断事件是否为空
        {
            MessageArrived("Hello Mum!"); 
        }

    建议定义事件的时候首字母最好不要大写,或者以On开始都可以,你这样变量名称和委托的名称一致了,虽然一般不会出什么问题,不过这样感觉不是很好.
    public event MessageHandler messageArrived;
      

  3.   

    事件其实就是一种委托,委托给别的类来执行当前类需要的事情,
    上面:
    new MessageHandler(myDisplay.DisplayMessage); 
    这个new的过程,已经把两个对象建立了联系当定义委托的地方,没有检查到有关联时当然会返回null
    在定义委托的地方,就像有一张表一样,这个表里面存放了所有委托的关联列表
    楼主可以看到c#中是用+、-号来关联和取消关联事件的,vb.net里面是addhandler和removehandler
      

  4.   

    事件其实就是一种委托,委托给别的类来执行当前类需要的事情, 
    上面: 
    new MessageHandler(myDisplay.DisplayMessage); 
    这个new的过程,已经把两个对象建立了联系 当定义委托的地方,没有检查到有关联时当然会返回null 
    在定义委托的地方,就像有一张表一样,这个表里面存放了所有委托实例的关联列表 
    楼主可以看到c#中是用+、-号来关联和取消关联事件的,vb.net里面是addhandler和removehandler
      

  5.   

    事件没有被注册之前都是null,C#通过+,-运算符注册或注销事件,这个叫法很多,有叫订阅,取消订阅,关联,取消关联等叫法。你要触发这个事件(做回调处理)之前要判断一下这个事件委托是否为空