C#anonymus代表效率/安全

UGE*_*EEN 2 c# performance delegates anonymous-delegates

我有进度表格,代表:

    // in ProgressForm thread
    public delegate void executeMethod(object parameters);      
    private executeMethod method;
    public object parameters;
    // ...
    private void ProgressForm_Shown(object sender, EventArgs e)
    {
         method.Invoke(parameters);
    }
Run Code Online (Sandbox Code Playgroud)

哪种方式更好(高效或安全)应用 - 匿名代表调用如下:

// in other thread
ProgressForm progress = new ProgressForm();
progress.ExecuteMethod = delegate
{
   // to do
}
Run Code Online (Sandbox Code Playgroud)

或使用这样的单独方法:

// in other thread
private void myMethod(object par)
{
     // to do
}

progress.ExecuteMethod = this.myMethod;
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 6

最终他们惊人地相似; 简单地说,编译器在内部为匿名情况创建隐藏方法.有没有具体的性能差异,但是在某些情况时,它可以选择创建一个静态方法(如果它不使用this或任何捕获变量) -可以帮助轻微(但不足以感到兴奋)

我会在以下情况下使用匿名方法:

  • 它是短暂的,其逻辑相关的代码inits匿名方法
  • 它可能使用其他难以传递的上下文(捕获变量) myMethod

要注意的主要是臭名昭着foreach(通常)捕获的变量问题,但在某些情况下,也可以将引用放入匿名方法,从而意外地延长对象的生命周期.

对于更长的工作,我会使用myMethodapprach.