以类似拳击的方式召集代表

本文关键字:方式召 拳击 | 更新日期: 2023-09-27 18:33:22

我经常看到委托调用的代码示例如下:

'

    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
        {
        }
    }

'

为什么要使用 [instance] 对象?起初我以为这是公司惯例,但看到经验丰富的开发人员也这样做。有什么好处?

以类似拳击的方式召集代表

这样做

是因为线程安全,以及在委托null的情况下防止异常引发。

请考虑以下代码:

if (this.OnStart != null)
{
  this.OnStart(this, System.EventArgs.Empty);
}

在执行if和执行this.OnStart之间,OnStart委托可能纵(可能改为null,这将导致异常)。

在您在问题中提供的表格中,将制作委托的副本并在执行时使用。原始委托中的任何更改都不会反映在副本中,这将防止出现异常。但是,这样做有一个缺点:由于在此期间的任何更改都不会反映在副本中,其中还包括任何非null状态,将导致呼叫代理已被删除或未呼叫最近添加到其中的代理。