【文件属性】:
文件名称:委托的编译代码-python3+opencv3识别图片中的物体并截取的方法
文件大小:10.59MB
文件格式:PDF
更新时间:2021-07-10 13:22:15
.net之美 关键技术解析
3.3 委托的编译代码
再次回到3.2.1节的代码,注释掉编译错误的行,然后重新进行编译,再借助Reflactor
来对event的声明语句进行探究,看看为什么会发生这样的错误:
public event GreetingDelegate MakeGreet;
可以看到,尽管在GreetingManager中将MakeGreet声明为public,但是,实际上
MakeGreet会被编译成私有字段,难怪会发生上面的编译错误,因为它根本就不允许在
GreetingManager类的外面以赋值的方式访问,从而验证了前面小节的结论。
图3-1 MakeGreet编译后的结果
再进一步看下MakeGreet所产生的代码:
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);
}
现在已经很明确了:MakeGreet事件确实是一个GreetingDelegate类型的委托,只不过
不管是不是声明为public,它总是被声明为private。另外,它还有两个方法,分别是
add_MakeGreet和remove_MakeGreet,这两个方法分别用于注册委托类型的方法和取消注
册。实际上也就是:“+=”对应add_MakeGreet,“-=”对应remove_MakeGreet。而这两个方
法的访问限制取决于声明事件时的访问限制符。