Rah*_*han 3 .net c# convention delegates invocation
我经常看到代理调用的代码示例如下所示:
`
public delegate void DelegateThreadActivity<T, U> (T sender, U e);
public event DelegateThreadActivity<Thread, System.EventArgs> OnStart = null;
public event DelegateThreadActivity<Thread, System.EventArgs> OnStop = null;
// Helper method for invocation.
public void RaiseOnStart ()
{
DelegateThreadActivity<Thread, System.EventArgs> instance = null;
try
{
instance = this.OnStart;
// OR
instance = (DelegateThreadActivity) (object) this.OnStart;
if (instance != null)
{
instance(this, System.EventArgs.Empty);
}
}
catch
{
}
}
Run Code Online (Sandbox Code Playgroud)
`
为什么要使用这个[instance]对象?起初我认为这是公司惯例,但看到经验丰富的开发人员也这样做.有什么好处?
这样做是因为线程安全,并且在委托转向的情况下防止异常提升null.
考虑以下代码:
if (this.OnStart != null)
{
this.OnStart(this, System.EventArgs.Empty);
}
Run Code Online (Sandbox Code Playgroud)
在执行if和执行之间this.OnStart,OnStart委托可能已经被操纵(可能被更改为null,这将导致异常).
在您在问题中提供的表单中,会在执行时制作并使用委托的副本.原始代表中的任何更改都不会反映在副本中,这将防止异常出现.但是这有一个缺点:由于同时的任何更改都不会反映在副本中,其中也包括任何非null状态,将导致调用代理已被删除或未调用最近添加到其中的代理.
| 归档时间: |
|
| 查看次数: |
246 次 |
| 最近记录: |