【问题标题】:Is there any reason to use a function with a void return over an Action in C#?是否有任何理由在 C# 中使用具有 void return 的函数而不是 Action?
【发布时间】:2015-05-06 17:16:53
【问题描述】:

除了传统,我有什么理由要使用

void foo(int k) {
    // stuff
}

结束

Action<int> foo = new Action 
    ((k) => { 
        // stuff
    });

更一般地说,正常定义我的函数而不是将它们定义为委托有什么实际优势吗?

【问题讨论】:

  • 您的意思是除了更合理的语法以及它将是一个函数而不是开销的委托这一事实之外?没有...
  • 根据 Jon Skeet 的说法,委托可以更快,至少在使用该方法作为回调的目标时。 stackoverflow.com/questions/2082735/…
  • 作为接口方法 ... 还有:那又如何? - 你认为将糟糕的 javascript 部分引入 C# 是个好主意吗?
  • 有几个性能方面的考虑。创建委托是额外的分配。另一个是委托调用不能有效内联。
  • @Damien 请参阅this article,了解间接(虚拟/接口/委托调度)对内联的影响。

标签: c# function delegates action


【解决方案1】:

当然,有很多充分的理由。想到的前三个:

几乎所有 C# 程序员都会对您极其罕见地过度使用委托感到非常惊讶。

函数可以是virtual,可以用来实现接口。

可以重新分配变量,甚至是委托类型的变量,这会导致非常意外的行为。

但还有更多。

Eric Lippert 在评论中提到函数可以重载,变量不能。

方法可以实现为迭代器(使用yield关键字),匿名函数不能。

可以隐式调用一些特殊方法:new T { a, b, c } 查找名为 Add 的方法,而不是名为 Add 的变量。

预定义的委托类型不允许您使用refout 参数。

预定义的委托类型不允许您向返回类型或参数添加属性。

【讨论】:

    猜你喜欢
    • 2010-12-31
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 2011-11-25
    • 1970-01-01
    • 2018-03-02
    • 2018-10-20
    相关资源
    最近更新 更多