【问题标题】:Why I cannot compile a Custom Event declared in a Class Interface in C#为什么我无法编译在 C# 的类接口中声明的自定义事件
【发布时间】:2011-01-23 21:24:20
【问题描述】:

假设我有这个:

public interface ISlider {
    event CustomEventDelegate CustomEvent;

在我实现 ISlider 的课程中​​,我尝试了这个

public CustomEventDelegate  CustomEvent = delegate { };

但它说 CustomEvent 没有实现。

我需要做的是这样的:

   ISlider ISlider;
    ISlider = slider as ISlider;
    if (ISlider != null)
    {
        ISlider.CustomEvent += new CustomEventDelegate(MyCustomEventHandler);
    }
    else
    {
        // standard control
        this.slider.ValueChanged += new RoutedPropertyChangedEventHandler<double>(this.slider_ValueChange);
    } 

【问题讨论】:

    标签: c# .net asp.net winforms


    【解决方案1】:

    简单地说——这是一个字段,而不是一个事件

    一个事件实际上是一对方法(就像一个属性的工作原理一样)-但是像事件这样的字段使这变得微不足道(你甚至可以包括你的默认非空价值,这是(我假设)你的意图:

    public event CustomEventDelegate CustomEvent = delegate { };
           ^^^^^ <==== note the addition of "event" here
    

    几乎翻译成这样:

    private CustomEventDelegate customEvent = delegate { };
    public event CustomEventDelegate CustomEvent {
        add { customEvent += value;}
        remove { customEvent -= value;}
    }
    

    我说“几乎”是因为类似字段的事件还包括一些线程安全代码,这些代码很少需要但很难解释(并且取决于您使用的编译器版本)。

    当然,在我看来,最好不要使用这个,只检查事件是否为空:

    var snapshot = EventOrFieldName;
    if(snapshot != null) snapshot(args);
    

    实现此接口的示例:

    public interface ISlider
    {
        event CustomEventDelegate CustomEvent;
    }
    public class MyType : ISlider
    {
        public event CustomEventDelegate CustomEvent = delegate { };
    }
    

    【讨论】:

    • 嗯,好的,但我不确定我应该为我的类接口和我的类实现准确地做什么,因为我知道我需要在我的类上强制执行这个事件处理程序,请参阅我的帖子更新谢谢。跨度>
    • @user310291 - 我不明白评论;你需要做的是添加关键字event,就像我的第一个例子一样。
    • 好吧,我不明白,因为我的接口类 ISlider 中已经有了关键字 event。如果我将您的代码粘贴到我的 ISlider 中,它将无法编译。
    • @user310291 - 例如见编辑;我说的是class,而不是interface
    • @user:您的界面显示“我公开了一个事件”。您的班级说“我公开了一个委托类型的公共字段”。这些不是一回事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 2016-05-09
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    相关资源
    最近更新 更多