是否有任何理由在C#中的操作上使用返回为空的函数?

是否有任何理由在C#中的操作上使用返回为空的函数?,c#,function,delegates,action,C#,Function,Delegates,Action,除了传统,我想使用 void foo(int k) { // stuff } 结束 Action foo=新操作 ((k)=>{ //东西 }); 更一般地说,通常定义我的函数而不是将它们定义为委托有什么实际优势吗?当然,有很多好的理由。首先想到的三个问题是: 几乎所有C#程序员都会对您极其罕见的过度使用委托感到非常惊讶 函数可以是虚拟的,并且可以用于实现接口 变量,甚至是委托类型的变量,都可以重新分配,这将导致非常意外的行为 但还有很多 Eric Lippert在评论中提到函数可以

除了传统,我想使用

void foo(int k) {
    // stuff
}
结束

Action foo=新操作
((k)=>{
//东西
});

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

当然,有很多好的理由。首先想到的三个问题是:

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

函数可以是虚拟的,并且可以用于实现接口

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

但还有很多

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

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

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

预定义的代理类型不允许您使用
ref
out
参数


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

您的意思是除了更合理的语法和它将是一个函数而不是一个有开销的委托之外?不……根据Jon Skeet的说法,委托可以更快,至少在将该方法用作回调目标时是如此。作为接口方法。。。还有:那又怎样您认为将糟糕的javascript部分引入C#是个好主意吗?有几个性能方面的考虑因素。创建委托是一项额外的分配。另一个原因是委托调用无法有效内联。@Damien有关间接(虚拟/接口/委托分派)对内联的影响的讨论,请参阅。
Action<int> foo = new Action 
    ((k) => { 
        // stuff
    });