首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

委托和事件,该如何处理

2013-01-26 
委托和事件好:如题,public delegate void NameChangeEventHandler()//定义一个委托类,用于事件的public e

委托和事件
好:如题,
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……

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


[解决办法]
语法问题

明白里面的意思就行
[解决办法]
都一样,还有一种写法呢,
如果自己扩展一下,还可以有N种写法
[解决办法]
还可以这么写 好像


NameChange +=(s,e) =>.........

NameChange += delegate{ ......} 

[解决办法]
编译器帮你做了 加new的工作

热点排行