我注意到大多数开发人员都在使用事件进行回调,而且我不确定自己是否以正确的方式做事。
我注意到大多数开发者和#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
我希望有人可以向我解释两个代码之间的区别是什么?做代表的哪种方式是更好的做法?将它设置为静态是否更好?
答案 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 - 当您只想声明方法签名并从外部传递实现时(简化说明)。