C# 将事件添加到控件库的正确方法

C# 将事件添加到控件库的正确方法,c#,C#,我正在编写一个Winforms控件,它包装了一个JS库并扩展了一个web浏览器控件 当JS库调用一个事件时,我有一个对C#中一个方法的回调,该方法解析返回的JSON等。。。在该方法的末尾,我想触发一个事件,其中包含从JS返回的数据 我正在做以下工作: public event EventHandler<WebMercatorCoordinates> OnMapClick; public void JavascriptCallbackReceiver(String message)

我正在编写一个Winforms控件,它包装了一个JS库并扩展了一个web浏览器控件

当JS库调用一个事件时,我有一个对C#中一个方法的回调,该方法解析返回的JSON等。。。在该方法的末尾,我想触发一个事件,其中包含从JS返回的数据

我正在做以下工作:

public event EventHandler<WebMercatorCoordinates> OnMapClick;
public void JavascriptCallbackReceiver(String message)
        {
           //I'm parsing the string here
           if (OnMapClick != null)
                this.OnMapClick(this, new WebMercatorCoordinates(lat, lng));
        }
公共事件事件处理程序onmaplick;
public void JavascriptCallbackReceiver(字符串消息)
{
//我在这里解析字符串
if(onmaplick!=null)
this.onmaclick(this,新的WebMercatorCoordinations(lat,lng));
}
我不喜欢那个空支票。如果用户没有将自己的处理程序添加到
EventHandler onmaplick
,我必须检查它,以便不调用空委托

我是否应该在类的构造函数中向事件添加一个处理程序,使其永远不为null(对象将捕获自己的事件)?我也不喜欢那样(听起来更糟)

有没有更好的设计/编写方法?

使用C#6可以编写:

OnMapClick?.Invoke(this, new WebMercatorCoordinates(lat, lng));

阅读事件上升的方式不是线程安全的(访问代码> OnMapClick <代码>两次,考虑使用局部变量或使用<代码>?调用C 6)调用< <代码>事件> <代码>比直接使用它更好,请考虑将事件提升代码放入<代码>保护OnEngult方法(不要在某些事情上命名事件
,例如使用
MapClicked
)。您是否查看了
code review
标记工具提示?是的,我已查看了工具提示:P我认为它不适合于code review SE,因为我知道它不太正确。非常感谢您的输入,我不知道这些指导原则!我已删除
code review
标记,因为它不太受欢迎。