c# - 什么时候显式使用 delegate 关键字而不是 lambda 是更好的做法?

标签 c# c#-3.0 delegates lambda

关于显式使用 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/

相关文章:

c# - 存储从套接字读取的数据以供另一个线程读取的最有效方法是什么?

c# - 为什么 Powershell 无法识别 Add_Type block 中的 System.Data?

.net - 将方法转换为委托(delegate)?

c# - 无需框架即可相互通信的 ViewModel

c# - Cosmos sql 查询不返回数组

c# - 如何在另一个文本字段中查看一个文本字段中的文本?

c# - 彻底理解linq

c# - 将 ASP.NET 成员资格提供程序数据库与您自己的数据库一起使用?

swift - 在两个 *.swift 文件之间传递数据而不使用prepareForSegue

ios - 在 View Controller 之间传递多个标签时遇到问题