2

我有代表的进度表:

    // 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;
4

2 回答 2

6

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

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

  • 它很短,并且在逻辑上与初始化匿名方法的代码相关
  • 它可能使用难以传递的附加上下文(捕获的变量)myMethod

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

对于更长的工作,我会使用该myMethod方法。

于 2010-10-27T07:28:32.017 回答
2

性能是一样的。编译器将匿名委托转换为与任何其他方法一样的常规方法。如果您对代码进行 ILDSM,您将看到为匿名方法生成了一个真实的(但隐藏的)名称。

于 2010-10-27T07:30:29.840 回答