无法在没有附加处理程序的C#中触发事件.因此,在每次调用之前,有必要检查事件是否为空.
if ( MyEvent != null ) {
MyEvent( param1, param2 );
}
Run Code Online (Sandbox Code Playgroud)
我想保持我的代码尽可能干净,并摆脱那些空检查.我不认为这会影响性能,至少在我的情况下不会.
MyEvent( param1, param2 );
Run Code Online (Sandbox Code Playgroud)
现在我通过手动为每个事件添加一个空的内联处理程序来解决这个问题.这很容易出错,因为我需要记住这样做等等.
void Initialize() {
MyEvent += new MyEvent( (p1,p2) => { } );
}
Run Code Online (Sandbox Code Playgroud)
有没有办法使用反射和一些CLR魔法自动为给定类的所有事件生成空处理程序?
我想在发生陷阱时向任何订户通知警报消息.
我通过委托方法(myDelegate del)制作的代码很好.
我的问题是......
我想知道是否值得使用Eventhandler更好的代理?在我的情况下,不确定委托和事件之间的区别是什么?
通知(trapinfo t),这就是我在这里所做的,以获取陷阱信息.但似乎不是一个好主意.阅读一些介绍传递委托对象的在线教程课程,是否适合我的情况?我该怎么办?有什么建议?
非常感谢 :)
我的代码:
public class trapinfo
{
public string info;
public string ip;
public string cause;
}
public class trap
{
public delegate void myDelegate(trapinfo t);
public myDelegate del;
trapinfo info = new trapinfo();
public void run()
{
//While(true)
// If a trap occurred, notify the subscriber
for (; ; )
{
Thread.Sleep(500);
foreach (myDelegate d in del.GetInvocationList())
{
info.cause = "Shut Down";
info.ip = "192.168.0.1";
info.info = "Test";
d.Invoke(info);
}
}
} …Run Code Online (Sandbox Code Playgroud) 我正在实现一个ITracker看起来像这样的接口:
public interface ITracker
{
void Track(ITrackerEvent trackerEvent);
}
Run Code Online (Sandbox Code Playgroud)
我最初创建了这个包装Mixpanel.NET的接口的实现.然后我创建了另一个包装Application Insights的程序.但是,Application Insights需要Flush()将数据发送到服务器.
我不想仅仅因为其中一个实现需要一个方法而污染ITracker接口Flush().它会感觉像是一个漏洞的抽象.
但是,我需要在某个时候调用此方法(可能在应用程序关闭时)并且不希望每次Track调用时都这样做.
当Tracker在会话结束时被垃圾收集时,是否可以调用方法?这甚至是一个好方法吗?
我觉得我在这里错过了一招!