作者remmurds (雷穆尔德‧小一)
看板C_Sharp
标题Re: [问题] delegate的+=
时间Tue Feb 9 11:24:58 2010
※ 引述《QQ29 (我爱阿蓉)》之铭言:
: 在学习delegate和event时 动手练习一下
: 发现一个不甚理解的地方
: 以下有两个小程式
: 差异在delegate 一个摆在class内一个摆在main里面
: http://nopaste.csie.org/86a98 :class内
: http://nopaste.csie.org/a0101 :main里面
: 为什麽class内的delegate 可以使用+=
: 而main里面的 使用+= compile error就会跑出来
: Use of unassigned local variable 'foo'
: 但是C#不是预设会有初值
: 我看了一下两个范例foo的初值都是null
: 为啥会造成这样呢?
class XD
{
public delegate void PTR();
public PTR foo;
public void Invoke()
{
Console.WriteLine("hi");
}
public void triggerEvent()
{
foo();
}
}
class MainClass {
public static void Main()
{
XD cc = new XD(); //<-----这边已经初始化XD的物件!
cc.foo += new XD.PTR(cc.Invoke);
cc.triggerEvent();
}
}
因此这样写当然没问题,因为执行到那一行的同时已经把XD类别的所有成员都初始化
了,所以对foo便可使用 += 运算子将delegate附加上去。可是看看另一段程式:
delegate void PTR(); //<------问题一
class XD
{
public void Invoke()
{
Console.WriteLine("hi");
}
public void triggerEvent()
{
//foo();
}
}
class MainClass {
public static void Main()
{
PTR foo;
XD cc = new XD();
foo += new PTR(cc.Invoke); //<------问题二
cc.triggerEvent();
}
}
在问题一地方,你相当於把delegate放在 namespace中(别说你不知道它是啥),这种
写法的意义就相当於下两行你定义了一个XD的类别一样。简单来说,「你只是定义一个名
叫PTR的类别,而这个类别以delegate的形式存在。」
所以问题二的答案就很明显了,问题二就形同於把上一行的
XD cc = new XD();
改成像这样:
XD cc;
这样编译当然不会过。
: 因为看到event 那部分范例
: 加入event function都直接+=给初值
: 不是很了解....请教一下
: ps.
: cc.foo += cc.Invoke; 是不是以下那行的缩写
: cc.foo += new XD.PTR(cc.Invoke);
: 两种都compile可过 书上也没特别说明差异
: 以上 thx~
请自行google。event虽然是从delegate包装而来,不表示两着可视为同样的东西。
--
「我从来都不喜欢 MFC,从一开始就不喜欢,我认为它的设计不良,
且几乎不能算是物件导向。」
- Charles Petzold
http://iyoyo.info/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 219.87.77.101
1F:推 QQ29:r大 我想问一下 class内写delegate 是不是就是event 02/09 11:29
2F:→ QQ29:因为我就算不写event这字眼 根本就没有什麽差别... 02/09 11:29
3F:推 horngsh:用event这关键字经编译之後会化为delegate 02/09 13:47
4F:推 horngsh:明明范例2就有New XD();啊... 02/09 13:49
5F:推 QQ29:h大我看到写法 都是用delegate 建立一个物件 前面加上event 02/09 14:57
7F:→ QQ29:把 public event ChangedEventHandler Changed;改为 02/09 14:58
8F:→ QQ29: public ChangedEventHandler Changed;程式执行也正确耶 02/09 14:59
9F:→ QQ29:event 加不加有差吗@@ 02/09 14:59
10F:→ jhchou:event只是修饰delegate的关键字 帮delegate加上一些限制 02/09 16:10
11F:→ jhchou:你的例子可以试试把+= -=改成=试试看就知道了 02/09 16:13
12F:推 QQ29:加了event 就不能用= 给初值了orz .... 02/09 17:26
13F:→ QQ29:奇怪有什麽差吗= = 02/09 17:26
14F:推 liunate:背後储存delegate的机制不同,event比较支援丰富的行为 02/09 20:45