C#匿名代表效率/安全

时间:2010-10-27 07:15:12

标签: c# delegates performance 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);
    }

哪种方式更好(效率更高或更安全)才能应用 - 匿名代表这样调用:

// in other thread
ProgressForm progress = new ProgressForm();
progress.ExecuteMethod = delegate
{
   // to do
}

或使用这样的单独方法:

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

progress.ExecuteMethod = this.myMethod;

2 个答案:

答案 0 :(得分:6)

最终他们的惊人相似;简单地说,编译器在内部为匿名情况创建隐藏方法。没有具体的性能差异,尽管有些情况下它可能会选择创建静态方法(如果它不使用this或任何捕获的变量) - 这可能有助于略微(但还不足以让人兴奋)

我会在以下时间使用匿名方法:

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

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

对于更长时间的工作,我会使用myMethod apprach。

答案 1 :(得分:2)

表现相同。编译器将匿名委托转换为常规方法,就像任何其他方法一样。如果您使用ILDSM代码,您将看到为匿名方法生成了一个真实(但隐藏)的名称。