C# 匿名委托(delegate)效率/安全

标签 c# delegates performance anonymous-delegates

我有委托(delegate)的进度表:

    // 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);
    }

哪种方式更好(更有效或更安全)应用 - 匿名委托(delegate)这样调用:

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

最佳答案

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

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

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

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

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

关于C# 匿名委托(delegate)效率/安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4030791/

相关文章:

c# - MVVMLight 具有对应 View 的多个实例键控 View 模型

c# - 从 c# 内存不足异常调用 c++ 委托(delegate)

c - C 中最快的 fgets 实现

mysql - SQL 查询太慢,甚至在 EXPLAIN 上出现 "Using Index"

c# - 如何快速搜索单词或数字 c#

c# - 通过 C 库在 C# 应用程序之间共享数据

c# - .net 后端出现 Azure 移动服务未找到错误

c# - 将一种类型的委托(delegate)动态转换为另一种

c# - 将委托(delegate)传递给 Sort()

c - printf 减慢了我的程序