这时候,我们不得不注释掉编译错误的行,然后重新进行编译,再借助Reflactor来对 event的声明语句做一探究,看看为什么会发生这样的错误:

public event GreetingDelegate MakeGreet;

可以看到,实际上尽管我们在GreetingManager里将 MakeGreet 声明为public,但是,实际上MakeGreet会被编译成 私有字段,难怪会发生上面的编译错误了,因为它根本就不允许在GreetingManager类的外面以赋值的方式访问。

我们进一步看下MakeGreet所产生的代码:

现在已经很明确了:MakeGreet 事件确实是一个GreetingDelegate类型的委托,只不过不管是不是声明为public,它总是被声明为private。另外,它还有两个方法,分别是add_MakeGreet和remove_MakeGreet,这两个方法分别用于注册委托类型的方法和取消注册,实际上也就是: “+= ”对应 add_MakeGreet,“-=”对应remove_MakeGreet。而这两个方法的访问限制取决于声明事件时的访问限制符。

在add_MakeGreet()方法内部,实际上调用了System.Delegate的Combine()静态方法,这个方法用于将当前的变量添加到委托链表中。我们前面提到过两次,说委托实际上是一个类,在我们定义委托的时候:

public delegate void GreetingDelegate(string name);

当编译器遇到这段代码的时候,会生成下面这样一个完整的类:

关于这个类的更深入内容,可以参阅《CLR Via C#》等相关书籍,这里就不再讨论了。

public class GreetingDelegate:System.MulticastDelegate{

public GreetingDelegate(object @object, IntPtr method);
       public virtual IAsyncResult BeginInvoke(string name, AsyncCallback callback, object @object);
       public virtual void EndInvoke(IAsyncResult result);
       public virtual void Invoke(string name);

}

private GreetingDelegate MakeGreet;       //对事件的声明 实际是 声明一个私有的委托变量

[MethodImpl(MethodImplOptions.Synchronized)]
public void add_MakeGreet(GreetingDelegate value){
    this.MakeGreet = (GreetingDelegate) Delegate.Combine(this.MakeGreet, value);
}

[MethodImpl(MethodImplOptions.Synchronized)]
public void remove_MakeGreet(GreetingDelegate value){
    this.MakeGreet = (GreetingDelegate) Delegate.Remove(this.MakeGreet, value);
}

事件和委托的编译代码相关推荐

  1. C#中的委托和事件 (4)---事件和委托的编译代码

    事件和委托的编译代码 这时候,我们不得不注释掉编译错误的行,然后重新进行编译,再借助Reflactor来对 event的声明语句做一探究,看看为什么会发生这样的错误: public event Gre ...

  2. C#事件与委托(详解)

    C#事件与委托详解[精华 多看看] Delegate delegate是C#中的一种类型,它 实际上是一个能够持有对某个方法的引用的类. 与其它的类不同,delegate类能够拥有一个签名(signa ...

  3. C#事件与委托详解【精华 多看看】--转载于https://www.cnblogs.com/sjqq/p/6917497.html

    Delegate delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与 ...

  4. 刘铁锰老师C#语言入门详解(委托事件等部分有详细代码和注释)

    目录 1.初识类 1.1 类与对象的关系 1.2 类的三大成员 1.3 静态成员与实例成员 1.4 类修饰符 2.构成C#语言的基本元素 2.1 六个基本元素 2.2 算法简介 3. 详解类型.变量与 ...

  5. 说说.net事件和委托。

        一说到.net的事件,也许你会想都说教程满天飞,一个被说烂了的东西还有什么可以说的啊?是啊,的确有很多好文章剖析事件,比如张子阳先生的C# 中的委托和事件 重温Observer模式--热水器· ...

  6. C#事件与委托的区别

    1. 委托 事件是利用委托来定义的,因此先解释委托.委托其实是一个类,它与其他类如string(引用类型)等没有本质区别,string代表的是字符串,委托则代表的是一类方法,这类方法具有相同返回类型和 ...

  7. C#中的事件和委托(续)

    引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为细节的问题,包括一些大家常 ...

  8. 【转】C#事件和委托的理解

    知乎大佬多系列 作者:Junased 链接:https://www.zhihu.com/question/28932542/answer/42769044 来源:知乎 感觉官方说法可以搜索到,我就说理 ...

  9. 七天学习计划_c#_[2][3][4][5]委托、事件、委托与事件的区别、泛型委托、Func\Action\predicate

    由于委托之前的博客已经详细写了,这里就简单的过一遍,复习一下: 了解委托 基于委托开发事件驱动程序变得非常简单. 使用委托可以大大简化多线程编程难度. 理解委托 委托也可以看做成一种数据类型,可以定义 ...

最新文章

  1. yum源及yum仓库服务搭建讲解
  2. sphinx索引分析续
  3. 【转】IE浏览器快捷键大全
  4. P4015 运输问题
  5. 登录注册实现(服务器数据)
  6. 百度SEO网页背景渐变色代码
  7. 树莓派超声波车牌识别系统
  8. AE CC2018/64位安装步骤及各种出现问题!!(真的装了好久)
  9. 读《About Face 4 交互设计精髓》22
  10. sql2000 数据库置疑解决
  11. 开机需要手动启动无线
  12. 麦当劳将携手逾100所职业院校提升就业能力;百胜中国一季度开设315家新店 | 美通企业日报
  13. mapminmax()、zscore()数据归一化
  14. mybatis 查询条件包含list
  15. YouTube-dl命令报错
  16. 12-16 云计算平台基础架构
  17. mysql特殊符号无法储存_解决MYSQL数据库无法保存emoji表情及特殊符号问题
  18. 【树】二叉树的两种非递归遍历方法
  19. mysql导入数据时 USING BTREE 错误解决办法
  20. 苹果android怎么设置,iphone小圆点怎么设置调出来 自定义手势怎么用

热门文章

  1. 非对称网络不通 子网掩码是“祸首”
  2. js插入元素的新方法insertAdjacentHTML
  3. java常用序列化与反序列化方法
  4. Java使用OpenCV3.2实现视频读取与播放
  5. 能够生成动态图片的R模块:rCharts
  6. 因VPU预留内存太小造成的视频播放太卡
  7. 你想过35岁以后的出路吗
  8. 设计 Pastebin.com
  9. python精度_通过Python可以达到的最高时间精度范围是多少?
  10. 【论文写作】城市酒店入住信息管理系统中客房各项功能如何写