不能在子类或外部类发布C#事件代码分析
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();不能这样访问
}
}
}
分析
1、testeventa和testeventb最终生成的代码结构基本一样,可以知道c#编译器帮我们做了一些工作。
2、其实c#编译器应该可以做到允许我们直接调用的,比如:生成的字段为protected类型,考虑到封装性,编译器没这么做,我觉得是合理的。
为什么一定要这么发布事件(引入一个局部变量):
protected void ontesteventa()
{
var testeventa = this.testeventa;
testeventa();
}