gpt4 book ai didi

c# - 哪个是委托(delegate)声明的正确/更好的方式

转载 作者:太空狗 更新时间:2023-10-29 23:21:30 26 4
gpt4 key购买 nike

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

我注意到大多数开发人员的代码看起来像这样:

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

我希望有人能向我解释这两种代码之间的区别是什么?哪种委托(delegate)方式是更好的做法?将它设置为静态是否更好?

最佳答案

让我们看看您的代码:

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

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

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
}

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

关于c# - 哪个是委托(delegate)声明的正确/更好的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32929623/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com