C Event:C# 事件继承(one x event)

我有这个程序:

    cl 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);
        }
    }
    cl 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

6

当您在 C# 中使用“event”关键字声明事件时,生成的 IL 实际上包含两个相应的元素:私有委托字段和与声明的事件具有相同可见性的事件访问器。事件访问器不能用于激发事件。它仅用于订阅和取消订阅通知。您的SomethingChanged(this)代码正在使用私有字段来调用委托,并且该私有字段在类外部不可用。

1

密码

if (SomethingChanged != null)
    SomethingChanged(this);

(顺便说一句,它有一个竞争条件)意味着在SomethingChanged上调用Delegate.GetInvocationList。自动实现的事件不允许你这样做,除非你在事件定义的类中。

如果您手动实现了事件并提供了protected访问支持事件的委托字段,则可以执行此操作。

0

使用:

this.SomethingChanged += new One.del(one_SomethingChanged);

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(256)
Ae导入c4d:C4D:如何通过分色进行折射(color refraction)
上一篇
哈雷双灯滑翔cvo:使用交叉验证和F1分数选择SVM参数
下一篇

相关推荐

  • cv树洞柒夜事件CV树洞中的秘密与惊奇

    cv树洞柒夜事件是一个有趣的计算机视觉活动,它提供了一种新的方式来利用计算机视觉技术来探索和发现景观。它始于2020年7月,由一群热爱计算机视觉的研究者和开发者发起,他们希望通过使用机器学习技术来探索景观中的精彩之处。cv树洞柒夜事件的目标是使用机器学习技术来探索景观中的精彩之处,并利用这些发现来改善景观设计。参与者需要使用机器学习技术来探索景观,并利用这些发现来改善景观设计。参与者可以使用Python,OpenCV,TensorFlow等技术来完成任务,并将其发布在GitHub上。…

    2023-01-09 12:42:42
    0 60 14
  • cvt变速箱异响:排查CVT变速箱异响的方法

    cvt变速箱异响是指变速箱在运行时发出的异常噪音,这种异响可能是由于变速箱内部零件磨损、油质不佳或润滑不良等原因引起的。代码如下:…

    2023-02-13 07:48:44
    0 33 95
  • cheers for还是to:Cheers to a Bright Future!

    示例示例Cheers for和to都可以用来表达祝福或者庆祝的意思。Cheers for:表示对某人或某事的支持,是一种赞扬的表达方式。…

    2023-02-27 02:56:18
    0 17 40
  • css初始化样式:This is a Title

    示例示例CSS初始化样式是指在各浏览器中重置默认的样式,以便于在所有浏览器中保持一致的显示效果。下面是一个常用的CSS初始化样式代码:…

    2023-01-12 02:04:17
    0 50 59
  • for循环continue:How to Use the continue Statement in a for Loop

    示例示例for循环是让程序跳过当前循环,继续下一次循环。代码示例:…

    2023-02-26 12:04:08
    0 82 12
  • linux使用yum安装httpd:如何使用yum安装Apache HTTP Server (httpd)

    使用yum安装httpd:打开终端,输入以下命令:…

    2023-01-11 11:09:38
    0 59 19
  • javascript 替换字符串 Hello JavaScript

    JavaScript 替换字符串可以使用 String.prototype.replace() 方法来实现。该方法接受两个参数,第一个参数是要被替换的子字符串,第二个参数是用来替换的字符串。…

    2023-03-11 09:49:43
    0 61 57
  • vscode如何运行代码:如何在VSCode中运行代码

    示例示例在vscode中,打开要运行的代码文件,如下代码示例:点击vscode左上角的“运行”按钮,或者使用快捷键Ctrl+F5来运行代码,在vscode右下角的“输出”窗口中会显示出运行结果:…

    2023-03-09 09:29:23
    0 36 41

发表评论

登录 后才能评论

评论列表(45条)