关于显式使用 delegate
关键字而不是使用 lambda,是否有关于编码风格的最佳实践?
例如
new Thread(() =>
{
// work item 1
// work item 2
}).Start();
new Thread(delegate()
{
// work item 1
// work item 2
}).Start();
我认为 lambda 看起来更好。如果 lambda 是更好的样式,那么使用 delegate
关键字除了因为它在 lambda 实现之前就存在之外还有什么意义?
最佳答案
Lambda 语法更加通用,设计者表示他们最好删除旧的重叠语法(没有引用,但可能是 Eric Lippert 或 Jon Skeet 在一本书或播客中)。
但是 delegate
允许你忽略参数,例如:
object.Event += delegate { };
与不得不说:
object.Event += (sender,args) => { };
这在大型参数列表中非常有用和/或使代码更能适应重构。
编辑:正如 Yann Schwartz 所指出的那样在另一个答案(现在不幸被删除)中,这个技巧的一个非常巧妙的用法是使用空对象模式为事件提供默认处理程序:-
class MyClassThatFiresWithoutTheTrick
{
public event EventHandler MyEvent; // implicit = null
// Need a method to keep this DRY as each fire requires a null check - see Framework Design Guidelines by Abrams and Cwalina
protected virtual void OnMyEvent()
{
// need to take a copy to avoid race conditions with _removes
// See CLR via C# 3rd edition p 264-5 for reason why this happens to work
//var handler = MyEvent;
// BUT THIS is the preferred version
var handler = Interlocked.CompareExchange( ref MyEvent, null, null);
// Need to do this check as it might not have been overridden
if( handler == null)
return;
handler( this, EventArgs.Empty );
}
}
class MyClassThatFiresWithTheTrick
{
public event EventHandler MyEvent = delegate{};
protected virtual void OnMyEvent()
{
MyEvent( this, EventArgs.Empty );
}
}
(尽管您最终可能经常做的是 OnMyEvent
的内联方法,从而再次使代码更短。)
关于c# - 什么时候显式使用 delegate 关键字而不是 lambda 是更好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1832159/