日期:2014-05-17  浏览次数:20641 次

委托和事件
好:如题,
public delegate void NameChangeEventHandler();//定义一个委托类,用于事件的
public event NameChangeEventHandler NameChange;//定义一个事件

private void FirstName()//方法一     private void LastName()//方法二
{                                  {     
         ;                                        ;


1.事件加上方法
NameChange += new NameChangeEventHandler(FirstName);
NameChange += new NameChangeEventHandler(LastName);
2.事件加上方法
NameChange += FirstName;
NameChange += LastName;

这1和2两种情况都可以行,是为什么呢?

------解决方案--------------------
语法糖而已。。。。到了IL都一样~~~~~~~~~~~~~~
------解决方案--------------------
做了一个简化
你的事件是委托类型的 委托定义了签名只要方法符合签名就可以通过委托实现
也可以说你的事件在订阅的时候只要是符合这个签名就可以被触发
------解决方案--------------------
没研究过CIL,参照《C#与.NET3.5高级程序设计》290页。
其实都是语法上的表现而已,只是使用起来方便,到了底层CIL都是一致的。
哪个简单用哪个!
------解决方案--------------------
本帖最后由 caozhy 于 2013-01-16 22:12:11 编辑
为什么
string s = "hello world";

string s = new string("hello world".ToCharArray());
都可以呢?
------解决方案--------------------
NameChange += FirstName;//VS自动给你加了一个new NameChangeEventHandler而已
------解决方案--------------------
看IL代码,是一样的啊

p.NameChange += new NameChangeEventHandler(FirstName);

IL代码如下:

ldftn      void ConsoleApplication1.Program::FirstName()
newobj     instance void ConsoleApplication1.Program/NameChangeEventHandler::.ctor(object, native int)
callvirt   instance void ConsoleApplication1.Program::add_NameChange(class ConsoleApplication1.Program/NameChangeEventHandler)


p.NameChange += FirstName;

IL代码如下:

ldftn      void ConsoleApplication1.Program::FirstName()
newobj     instance void ConsoleApplication1.Program/NameChangeEventHandler::.ctor(object, native int)
callvirt   instance void ConsoleApplication1.Program::add_NameChange(class ConsoleApplication1.Program/NameChangeEventHandler)

------解决方案--------------------
引用:
看IL代码,是一样的啊

p.NameChange += new NameChangeEventHandler(FirstName);

IL代码如下:
C# code?123ldftn      void ConsoleApplication1.Program::FirstName()newobj     instance void ConsoleApplic……

编译器帮你干了这活
------解决方案--------------------
语法的简化,最后实现方法是一样的,楼上各位都说过了