C_Sharp 板


LINE

※ 引述《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
6F:→ QQ29:http://tinyurl.com/ygdcroc 02/09 14:58
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







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:iOS站内搜寻

TOP