.NET:为什么不能在子类或外部发布C#事件
2013-07-19 00:09
337 查看
背景
一个朋友问了一个问题:“为什么不能在子类或外部发布C#事件?”,我说我不知道,要看看生产的IL代码,下面我们看看。测试
代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EventStudy { class Program { static void Main(string[] args) { } } class Base { private Action _testEventB; public event Action TestEventA; public event Action TestEventB { add { _testEventB += value; } remove { _testEventB -= value; } } protected void OnTestEventA() { var testEventA = this.TestEventA; testEventA(); } protected void OnTestEventB() { var testEventB = _testEventB; testEventB(); } } class Child : Base { public void Do() { //this.TestEventA();不能这样访问 } } }
IL
分析
1、TestEventA和TestEventB最终生成的代码结构基本一样,可以知道C#编译器帮我们做了一些工作。2、其实C#编译器应该可以做到允许我们直接调用的,比如:生成的字段为protected类型,考虑到封装性,编译器没这么做,我觉得是合理的。
一则笑话
一位老先生问我如何拷贝文件,我说Control+C,然后Control+V,第二天他告诉我不行,后来发现他是在公司Control+C,回到家里Control+V的。今天发生了真人版的这个事情,一位非常有前途的兄弟,在一个基类里定义了一个Event,有两个子类,分别为A和B,在A的实例里发布Event,在B的实例里监听这个Event。
一个问题
为什么一定要这么发布事件(引入一个局部变量):protected void OnTestEventA() { var testEventA = this.TestEventA; testEventA(); }
背景
找个机会得看看一些C#本质之类的书了,很多概念我也不是很清楚!相关文章推荐
- 为什么不能在子类或外部发布C#事件
- 不能在子类或外部类发布C#事件代码分析
- 封装 JMail 4.4 的 POP3 为 .Net 组件 (.dll 程序集),实现 "邮件(附件) 到达" 等 "事件,c#接收邮件
- 博客开发手记1 – 不能发布URL长度超过280字符微博的解决方案(C#实现)
- 为什么在RichEdit控件里插入ActiveX控件,该ActiveX控件不能响应事件?
- 为什么jQuery不能监听body的滚动事件呢?
- 【C#|.NET】从控制反转(依赖注入)想到事件注入 (非AOP)
- .net网站发布后 局域网不能浏览
- .net 在类中的Event事件,为什么可以定义为static?而委托类型却不可以
- 为什么子类不能访问基类的private成员?为什么要这样设计?
- 为什么C++编译器不能支持对模板的分离式编译--error LNK2019: 无法解析的外部符号
- 既然C++读作“C加加”,那为什么C#不能读作“C井”呢?
- 为什么子类不能访问基类的private成员?为什么要这样设计?
- 为什么子类不能访问基类的private成员?为什么要这样设计?
- .NET之美——C# 中的委托和事件
- 关于子类中不能调用基类中定义的事件问题
- C# 一段绘图代码 在form_load事件不能显示图
- 郁闷,为什么不能用live Writer发布了?
- .net 4.0发布后不能正常显示图片问题,将iis应用程序池设置成4.0版本,报告错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
- 为什么子类的访问权限不能低于超类的访问权限