惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
T
Troy Hunt's Blog
博客园 - 【当耐特】
N
Netflix TechBlog - Medium
V
V2EX
I
InfoQ
量子位
Hugging Face - Blog
Hugging Face - Blog
The Register - Security
The Register - Security
J
Java Code Geeks
V
Visual Studio Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Security @ Cisco Blogs
爱范儿
爱范儿
Hacker News: Ask HN
Hacker News: Ask HN
Recent Commits to openclaw:main
Recent Commits to openclaw:main
B
Blog
Apple Machine Learning Research
Apple Machine Learning Research
V2EX - 技术
V2EX - 技术
罗磊的独立博客
S
Security Affairs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
IT之家
IT之家
O
OpenAI News
W
WeLiveSecurity
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
GbyAI
GbyAI
The Hacker News
The Hacker News
Attack and Defense Labs
Attack and Defense Labs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Microsoft Azure Blog
Microsoft Azure Blog
F
Fortinet All Blogs
Schneier on Security
Schneier on Security
雷峰网
雷峰网
Scott Helme
Scott Helme
B
Blog RSS Feed
有赞技术团队
有赞技术团队
Recent Announcements
Recent Announcements
L
LangChain Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Y
Y Combinator Blog
Help Net Security
Help Net Security
NISL@THU
NISL@THU
A
About on SuperTechFans
L
LINUX DO - 最新话题
博客园 - 司徒正美
博客园 - 聂微东
博客园 - 三生石上(FineUI控件)
Spread Privacy
Spread Privacy
P
Proofpoint News Feed

博客园 - 阳春三月

工作态度两则 泛型小经验 【转载】看图测性格 【转载】乔海燕-外科医生的手术技巧 记念 33-101 使用 MyMeta 组件获取数据库结构 获取 SQL Server 2005 中的元数据 看博客园文章的一点感想 伟大的 PL/Sql Developer——数据库结构比较 新年礼物:推荐小工具 C#属性的实质还是方法 abstract、virtual、override 和 new 在 IE 中承载 Winform 应用程序 安装 VS2008 SP1 后需要给 TFS2008 装 SP1 更新下载程序集缓存 尼康 P5100 的几张片子 吃油饼的男人 Linq error: Sequence contains no elements TFS 问题两则
事件与委托有别, delegate 与 Delegate 相异 - 阳春三月
阳春三月 · 2009-01-10 · via 博客园 - 阳春三月

    我们都知道事件是特殊的委托,特殊在哪儿?

    我只发现了一点,就是委托类型在初始化时可以用“=”,而事件只能是“+="。这使得事件处理程序只能一个个的往上挂,然后用”-=“一个个的注销,从而避免了委托的”=“一下子只赋为一个方法或赋为 null 而遭清空。这有用吗?有用。比如你开发组件的时候,某个业务对象的事件被触发,你想先在组件内部处理一下,处理完了再往外传,让组件调用方处理,这时你就得用 event 声明;如果只是声明为 delegate,则可能组件调用方一个“=”赋值,你的方法就没机会执行了。由此可见,如果可能会多次委托处理,应该声明为 event;只处理一次,delegate 就够了

    实际上 delegate 也可以用“+=”赋值,此时效果跟 event 一样。但谁敢保证调用方不会来个“=”呢!

    delegate 之所以也能“+=”赋值,是因为用 delegate 声明的委托实际是 System.MulticastDelegate 类型,叫多路广播委托,天生拥有多路广播的能力。

    注意,delegate 开头是小写的 d,如果换成大写开头的 Delegate,那差别可就大了,简直是孙子和爷爷的区别。为什么说是孙子和爷爷呢?因为 delegate 仅仅是 C# 的关键字,表示一个继承自 System.MulticastDelegate 的具体委托类,而 Delegate 却是  System.MulticastDelegate 的父类,这还不是孙子和爷爷吗。另外,Delegate 和  System.MulticastDelegate 都是抽象类,只有编译器才可以从此类派生。也就是说,除了用 delegate 这种形式,我们不能显式地从这两个类派生。

    关于 delegate 和 Delegate,我以前一直以为是一样的,就像 string 之于 String,bool 之于 Boolean,仅仅是个方便书写的别名。这次发现它们的区别,是在看王翔的新书《设计模式——基于C#的工程化实现》时。王翔说“delegate 声明的 Delegate 类型其实本身继承自  System.MulticastDelegate ”,我认为他说反了,寻思着给人家发个邮件指出一个 bug,没想到是我自己没弄清楚。

    最后感叹一下,王翔跟我同年同级,他海大物理系毕业,也算半路出家。同样毕业七年,人家都出书了,我还得努力啊。