为什么我不能编译自定义事件在C#中的类接口中声明自定义、接口、声明、事件

2023-09-03 03:54:42 作者:南轩

让我们说我有这样的:

 公共接口ISlider {
    事件CustomEventDelegate自定义事件;
 

在这里我实现ISlider类的,我想这

 公共CustomEventDelegate自定义事件委托= {};
 
为什么可以在类中声明一个接口 然后在同一个类中的方法中声明这个接口,接口不是不能被new吗

但它说,自定义事件未实现。

我需要做的是这样的:

  ISlider ISlider;
    ISlider =滑块作为ISlider;
    如果(ISlider!= NULL)
    {
        ISlider.CustomEvent + =新CustomEventDelegate(MyCustomEventHandler);
    }
    其他
    {
        //标准控制
        this.slider.ValueChanged + =新RoutedPropertyChangedEventHandler<双>(this.slider_ValueChange);
    }
 

解决方案

简单 - 这是一个的字段的,不是的事件的

事件其实是一对方法(怎么样一个属性工程) - 但的字段类似事件的作出这样的小事(你甚至可以包括默认非空值,这是(我认为)你的意图:

 公共事件CustomEventDelegate自定义事件委托= {};
       ^^^^^< ====注意,除了活动在这里
 

这是翻译的几乎的,如:

 私人CustomEventDelegate自定义事件委托= {};
公共事件CustomEventDelegate自定义事件{
    添加{自定义事件+ =值;}
    除去{自定义事件 -  =值;}
}
 

我说几乎是因为字段的事件还包括一些线程安全code,这是很少必要的,但棘手的解释(并取决于哪一个版本,你所使用的编译器)。

当然,在我看来,这是最好不要用这个的所有的,只是检查事件对空:

  VAR快照= EventOrFieldName;
如果(!快照= NULL)快照(参数);
 

实现此接口的实例:

 公共接口ISlider
{
    事件CustomEventDelegate自定义事件;
}
公共类MyType的:ISlider
{
    公共事件CustomEventDelegate自定义事件委托= {};
}
 

Let's say I have this:

public interface ISlider {
    event CustomEventDelegate CustomEvent;

In the class where I implements ISlider, I tried this

public CustomEventDelegate  CustomEvent = delegate { };

But it says that CustomEvent is not implemented.

I need to do is something like this:

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

解决方案

Simply - that is a field, not an event.

An event is actually a pair of methods (like how a property works) - but field like events make that trivial (you can even include your default non-null value, which is (I assume) your intent:

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

That translates almost like:

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

I say "almost" because field-like events also include some thread-safety code, which is rarely needed but tricky to explain (and varies depending on which version of the compiler you are using).

Of course, in my opinion it is better to not use this at all, and just check the event for null:

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

Example of implementing this interface:

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