我有一个事件处理的例子程序,代码如下:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//定义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)这种写法是什么意思呢?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//定义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)这种写法是什么意思呢?
这个是public的,所以TestEvent是在实例创建后由外部赋值的;
TestEvent(this,e)是调用委托:
public delegate void TestEventHandler(object sender, TestEventArgs e);
TestEvent是上面类型的委托,所以TestEvent(this,e)是传递参数给事件订阅者;
if (TestEvent != null) TestEvent(this, e); 这个代码我不理解
这句话不是用来关联事件和委托以及处理方法的吗?
那if (TestEvent != null) TestEvent(this, e); 中的TestEvent(this, e); 起到什么作用呢
evenSource.TestEvent += new TestEventSource.TestEventHandler(KeyPressed);
上面这行就是把KeyPressed函数传进去,TestEvent就不为nullevenSource.TestEvent -= new TestEventSource.TestEventHandler(KeyPressed);
TestEvent为null
----------------------------------
这句话本身是错误的!public event TestEventHandler TestEvent;只有声明了一个委托对象,没有赋值,此时当然是null, 只有给它赋值以后才!null
Test.TestEvent+=new TestEventHandler(testhandler);
那个TestEvent 才不为空,TestEvent(this, e)才执行;
TestEvent(this, e)执行的是委托吗?,他的作用是什么啊
你看看这篇文章吧
http://cactusprogram.appspot.com/?p=254001
当你引用了事件
xmltocsv.OnTotalTransTime += OnXmlTotalTime;
我没有处理时间时,就是没有下面这段代码
private void OnXmlTotalTime(int sender)
{
label2.Text = "预计转换的时间为:" + sender.ToString() + "秒";
}
不判空,强行输出事件就是报错
if (OnTotalTransTime != null)
{
OnTotalTransTime(itotaltime);
}
当你没有引用事件
xmltocsv.OnTotalTransTime += OnXmlTotalTime;
private void OnXmlTotalTime(int sender)
{
label2.Text = "预计转换的时间为:" + sender.ToString() + "秒";
}
不判空,强行输出事件就是报错
if (OnTotalTransTime != null)
{
OnTotalTransTime(itotaltime);
}