哪个是委托声明的正确/更好的方式

时间:2015-10-04 03:02:35

标签: c#

我注意到大多数开发人员都在使用事件进行回调,而且我不确定自己是否以正确的方式做事。

我注意到大多数开发者和#39;代码看起来像这样:

public delegate void SampleDelegate();
public static event SampleDelegate SampleEvent;

虽然我的方式"事件"看起来像这样:

public delegate void SampleDelegate();
public SampleDelegate SampleEvent; // notice that I didn't set to static and not an event type

我希望有人可以向我解释两个代码之间的区别是什么?做代表的哪种方式是更好的做法?将它设置为静态是否更好?

1 个答案:

答案 0 :(得分:4)

让我们看看您的代码:

public delegate void SampleDelegate();
public SampleDelegate SampleEvent;

这不是一个事件。因为您可以调用SampleEvent 外部包含的类:

public class TestClass
{
    public delegate void SampleDelegate();
    public SampleDelegate SampleEvent;
}

public void TestMethod()
{
    var a = new TestClass();
    a.SampleEvent();
}

此外,您可以将其设置为新值:

public void TestMethod()
{
    var a = new TestClass();
    a.SampleEvent = null;
}

这不是事件行为。 界面不能包含此事件":

public interface ITestInterface
{
    //TestClass.SampleDelegate SampleEvent; //does not compile
}

所以正确的方法 - 为真实事件添加event字词:

public class TestClass : ITestInterface
{
    public delegate void SampleDelegate();
    public event SampleDelegate SampleEvent;

    private void FireEvent()
    {
        var handler = SampleEvent;
        if (handler != null)
            handler();
    }
}

public interface ITestInterface
{
    event TestClass.SampleDelegate SampleEvent;
}

现在你只能从包含的类中调用它:

public void TestMethod()
{
    var a = new TestClass();
    //a.SampleEvent(); //does not compile
    a.SampleEvent += A_SampleEvent; //subscribe to event
}

private void A_SampleEvent()
{
    Console.Write("Fired"); //fired when FireEvent method called
}

所以,你必须理解代表和事件之间的区别。并针对不同情况选择合适的方式: 事件 - 当您需要对其他类(一个或多个)进行一些更改时。 Delegetes - 当您只想声明方法签名并从外部传递实现时(简化说明)。