我有一个事件处理的例子程序,代码如下:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//定义delegate public delegate void TestEventHandler(object sender, TestEventArgs e); //用event 关键字声明事件对象 public event TestEventHandler TestEvent; //事件触发方法 protected virtual void OnTestEvent(TestEventArgs e){ if (TestEvent != null)                  TestEvent(this, e); } //引发事件 public void RaiseEvent(char keyToRaiseEvent){ TestEventArgs e = new TestEventArgs(keyToRaiseEvent); OnTestEvent(e); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
其中if (TestEvent != null) TestEvent(this, e);   这个代码我不理解,显然 TestEvent这个事件是非null的,可是什么时候赋值的呢?还有就是TestEvent(this, e)这种写法是什么意思呢?

解决方案 »

  1.   

    OnTestEvent(e);  不就触发事件了吗?因为TestEvent是TestEventHandler类型的事件,TestEventHandler的参数就是(object sender, TestEventArgs e);  
      

  2.   

    public event TestEventHandler TestEvent;  
    这个是public的,所以TestEvent是在实例创建后由外部赋值的;
    TestEvent(this,e)是调用委托:
    public delegate void TestEventHandler(object sender, TestEventArgs e);  
    TestEvent是上面类型的委托,所以TestEvent(this,e)是传递参数给事件订阅者;
      

  3.   

    但是
    if (TestEvent != null) TestEvent(this, e); 这个代码我不理解
      

  4.   

    evenSource.TestEvent += new TestEventSource.TestEventHandler(KeyPressed); 
    这句话不是用来关联事件和委托以及处理方法的吗?
    那if (TestEvent != null) TestEvent(this, e); 中的TestEvent(this, e); 起到什么作用呢
      

  5.   

    5楼的大哥,请问什么时候会为null呢?
      

  6.   

    委托、事件就是把函数当做参数传,触发事件时,就是调用传进去的函数
    evenSource.TestEvent += new TestEventSource.TestEventHandler(KeyPressed);  
    上面这行就是把KeyPressed函数传进去,TestEvent就不为nullevenSource.TestEvent -= new TestEventSource.TestEventHandler(KeyPressed);  
    TestEvent为null
      

  7.   

    显然 TestEvent这个事件是非null的  
    ----------------------------------
    这句话本身是错误的!public event TestEventHandler TestEvent;只有声明了一个委托对象,没有赋值,此时当然是null, 只有给它赋值以后才!null
      

  8.   

    判断是否添加事件的。比如你这个类有个实例Test,那么只有加了这个事件,
    Test.TestEvent+=new TestEventHandler(testhandler);
    那个TestEvent 才不为空,TestEvent(this, e)才执行; 
      

  9.   

    9楼的大哥
    TestEvent(this, e)执行的是委托吗?,他的作用是什么啊
      

  10.   

    你的事件定义看起来真别扭
    你看看这篇文章吧
    http://cactusprogram.appspot.com/?p=254001
    当你引用了事件
    xmltocsv.OnTotalTransTime += OnXmlTotalTime; 
    我没有处理时间时,就是没有下面这段代码
    private void OnXmlTotalTime(int sender) 

        label2.Text = "预计转换的时间为:" + sender.ToString() + "秒"; 

    不判空,强行输出事件就是报错
    if (OnTotalTransTime != null) 

        OnTotalTransTime(itotaltime); 
      

  11.   

    上面错,应该是
    当你没有引用事件
    xmltocsv.OnTotalTransTime += OnXmlTotalTime;  
    private void OnXmlTotalTime(int sender)  
    {  
      label2.Text = "预计转换的时间为:" + sender.ToString() + "秒";  
    }  
    不判空,强行输出事件就是报错
    if (OnTotalTransTime != null)  
    {  
      OnTotalTransTime(itotaltime);  
    }