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

我有这个程序:

    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

6

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

1

密码

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

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

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

0

使用:

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

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

(172)
Cmd好玩的指令:CMD指令中是否允许DockerARG
上一篇
Capital的:CapitalOneHygieia的替代方案
下一篇

相关推荐

  • java和c#哪个好哪个更适合你?

    这个问题的答案取决于你要使用它们来做什么。Java和C都是流行的编程语言,它们都有自己的优点和缺点。Java是一种面向对象的编程语言,它有良好的可移植性,可以在多种平台上运行,而且具有高度的安全性。Java的编程模型非常简单,因此它很容易学习。Java编写的应用程序也可以在多种不同的设备上运行,例如智能手机、平板电脑和桌面计算机。…

    2023-01-30 05:09:27
    0 45 63
  • cshtml教程:C# Razor 语法教程

    示例示例cshtml教程cshtml是一种基于Razor语法的ASP.NET视图引擎,用于创建动态Web页面。它使用C#或Visual Basic代码和HTML标记来构建Web应用程序的用户界面。…

    2023-02-10 06:49:58
    0 79 23
  • java和c#区别:Java与C#的异同点比较

    示例示例Java和C#是两种非常流行的编程语言,它们之间有许多相似之处,但也有一些明显的差异。语法:Java语法更接近C++,而C#更接近C语言。…

    2023-08-28 15:35:48
    0 49 12
  • C语言的开发环境:创建C#Winform开发和生产环境

    关于C语言的开发环境的问题,在winform development中经常遇到,我想知道为我的 C # winforms 项目正确创建开发和生产环境的最佳方法是什么。不幸的是没有开发环境。相反,每次我希望创建 Production 或 Development 构建时,我必须指定发布路径。此外,由于每个 prod 或 dev 构建使用不同的连接字符串,因此我必须进入代码并进行更改。…

    2023-12-29 06:38:01
    0 98 70
  • C语言学习进阶:如何用 c#语言做一个棒球跑者进阶的代码(需要帮助)

    关于C语言学习进阶的问题,在learn to code with baseball中经常遇到,我试图在 Unity 中创建一个基于短信的棒球应用程序。我想要一个 C # unity 函数在我的小编码中正在这样做。我有 2 个可变的击球手和跑步者。我希望他们根据我给击球手和跑步者的变量来运行。所以我也有 1 号到 9 号棒球运动员一个接一个地来到盘子。…

    2024-02-08 12:47:37
    0 73 16
  • C#要学多久:C#-为什么要实现标准异常构造函数

    关于C#要学多久的问题,在standard constructors中经常遇到,从 MSDN,代码分析警告 CA1032:…

    2024-01-07 15:05:06
    0 79 85
  • C#保存文件:无法使用 C#保存Excel文件

    关于C#保存文件的问题,在why can't i save excel中经常遇到,我正在尝试在 Excel 中修改和保存数据。使用下面的代码,我正在访问工作表,执行修改,然后保存文件。我无法保存文件。这是我的代码:…

    2023-10-25 05:47:58
    0 53 25
  • Unity3d为什么用c#:Unity3d中的 c# 方法重写

    关于Unity3d为什么用c#的问题,在unity override function中经常遇到,在最近几周,我使用 c # 作为脚本语言与 Unity3d 一起玩。我以前从未使用过 c # 或 Unity3d,并且我试图了解方法重写如何在 Unity 框架中工作。令我惊讶的是,我可以扩展基类MonoBehavior并覆盖诸如Start (),Update ()等方法,而不必使用3…

    2024-01-19 01:28:26
    0 64 16

发表评论

登录 后才能评论

评论列表(29条)