相关疑难解决方法(0)

C#:什么是虚拟事件以及它们如何使用?

虚拟活动如何运作?你会怎么覆盖它?那会怎么样?在什么情况下你会这样做?

例如,它是否可以替代受保护的OnEvent方法?那么继承类可以覆盖事件并直接引发它吗?或者那是错的还是不行?

MSDN对此说了这样的话:

可以使用virtual关键字将事件标记为虚拟事件.这使派生类可以使用override关键字覆盖事件行为.还可以密封覆盖虚拟事件的事件,该事件指定对于派生类,它不再是虚拟的.

但这并没有让我更加明智.密封的东西是显而易见的.

注意:我已经看到了C#中的虚拟事件如何工作?问题,但它并不是真正的虚拟事件如何运作.相反,这个人是如何得到他们使用它们得到的结果.试图弄清楚他的例子和答案中的虚拟事件是什么,但实际上并没有真正理解它.

c# events virtual inheritance

21
推荐指数
1
解决办法
9132
查看次数

虚拟事件如何在C#中运行?

以下是我用于测试的程序.它打印(如预期):

Raise A
Event from A
Raise B
Event from B
Run Code Online (Sandbox Code Playgroud)

现在,如果我们改变Main的前两行是:

        A a = new B();
        B b = new B();
Run Code Online (Sandbox Code Playgroud)

该计划将打印:

Raise A
Raise B
Event from B
Run Code Online (Sandbox Code Playgroud)

这也是预期的,因为重写事件会隐藏基类中的私有支持字段,因此基类触发的事件对派生类的客户端不可见.

现在我将相同的行改为:

 B b = new B();
 A a = b;
Run Code Online (Sandbox Code Playgroud)

程序开始打印:

Raise A
Raise B
Event from A
Event from B
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?

class A
{
    public virtual event EventHandler VirtualEvent;
    public void RaiseA()
    {
        Console.WriteLine("Raise A");
        if (VirtualEvent != null)
        {
            VirtualEvent(this, EventArgs.Empty);
        }
    }
}
class B : …
Run Code Online (Sandbox Code Playgroud)

c# compiler-construction events

9
推荐指数
1
解决办法
4048
查看次数

标签 统计

c# ×2

events ×2

compiler-construction ×1

inheritance ×1

virtual ×1