我有这个程序:
class One
{
public delegate void del(object o);
public event del SomethingChanged;
int x;
public int X
{
get { return x; }
set { x = value; OnSomethingChanged(this); }
}
protected void OnSomethingChanged(object o)
{
if (SomethingChanged != null)
SomethingChanged(o);
}
}
class Two: One
{
public void ChangeSomething()
{
//if (SomethingChanged != null)
// SomethingChanged(this);
OnSomethingChanged(this);
}
}
static void Main(string[] args)
{
One one = new One();
Console.WriteLine(one.X);
one.SomethingChanged += new One.del(one_SomethingChanged);
one.X = 5;
}
static void one_SomethingChanged(object o)
{
Console.WriteLine(((One)o).X);
}
有 2 个类-One 和 Two,Two 是 One 的后代。在类 One (SomethingChanged) 中声明了事件,它是由类 One 和类 Two 触发的。但是看看 Two.ChangeSomething-它通过调用基类的方法来引发事件。但是如果我尝试使用原始代码调用事件,如
if (SomethingChanged != null) SomethingChanged(this);
我得到编译器错误说
The event 'One.SomethingChanged' can only appear on the left hand side of += or -= (except when used from within the type 'eventstest.Program.One')
所以我只是好奇为什么我不能在类中使用“原始”代码来引发事件,但是当我调用相应的函数事件时?
[编辑] 在这里找到一些澄清:C#: Raising an inherited event
当您在 C# 中使用“event”关键字声明事件时,生成的 IL 实际上包含两个相应的元素:私有委托字段和与声明的事件具有相同可见性的事件访问器。事件访问器不能用于激发事件。它仅用于订阅和取消订阅通知。您的SomethingChanged(this)
代码正在使用私有字段来调用委托,并且该私有字段在类外部不可用。
密码
if (SomethingChanged != null)
SomethingChanged(this);
(顺便说一句,它有一个竞争条件)意味着在SomethingChanged
上调用Delegate.GetInvocationList
。自动实现的事件不允许你这样做,除非你在事件定义的类中。
如果您手动实现了事件并提供了protected
访问支持事件的委托字段,则可以执行此操作。
使用:
this.SomethingChanged += new One.del(one_SomethingChanged);
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(32条)