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

Cad*_*Loh 5 c#

我注意到大多数开发人员正在使用事件进行回调,我不确定我是否正在以正确的方式进行操作.

我注意到大多数开发人员的代码如下所示:

public delegate void SampleDelegate();
public static event SampleDelegate SampleEvent;
Run Code Online (Sandbox Code Playgroud)

虽然我做"事件"的方式如下:

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

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

Bac*_*cks 3

让我们看看你的代码:

public delegate void SampleDelegate();
public SampleDelegate SampleEvent;
Run Code Online (Sandbox Code Playgroud)

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

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

public void TestMethod()
{
    var a = new TestClass();
    a.SampleEvent();
}
Run Code Online (Sandbox Code Playgroud)

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

public void TestMethod()
{
    var a = new TestClass();
    a.SampleEvent = null;
}
Run Code Online (Sandbox Code Playgroud)

这不是事件行为。接口不能包含此“事件”:

public interface ITestInterface
{
    //TestClass.SampleDelegate SampleEvent; //does not compile
}
Run Code Online (Sandbox Code Playgroud)

所以正确的方法是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;
}
Run Code Online (Sandbox Code Playgroud)

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

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
}
Run Code Online (Sandbox Code Playgroud)

因此,您必须了解委托和事件之间的区别。并针对不同情况选择适当的方式: 事件 - 当您需要通知其他类(一个或多个)有关某些更改时。委托 - 当您只想声明方法签名并从外部传递实现时(简化解释)。