我注意到大多数开发人员正在使用事件进行回调,我不确定我是否正在以正确的方式进行操作.
我注意到大多数开发人员的代码如下所示:
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)
我希望有人可以向我解释两个代码之间的区别是什么?做代表的哪种方式是更好的做法?将它设置为静态更好吗?
让我们看看你的代码:
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)
因此,您必须了解委托和事件之间的区别。并针对不同情况选择适当的方式: 事件 - 当您需要通知其他类(一个或多个)有关某些更改时。委托 - 当您只想声明方法签名并从外部传递实现时(简化解释)。
| 归档时间: |
|
| 查看次数: |
209 次 |
| 最近记录: |