C#7本地函数比lambdas有什么好处?

时间:2017-10-09 22:44:24

标签: c# .net methods lambda

前几天,在我的一个实用程序中,ReSharper向我暗示了下面的代码段,声明定义委托ThreadStart的lambda可以转换为本地函数:

public void Start(ThreadPriority threadPriority = ThreadPriority.Lowest)
{
    if (!Enabled)
    {
        _threadCancellationRequested = false;

        ThreadStart threadStart = () => NotificationTimer (ref _interval, ref _ignoreDurationThreshold, ref _threadCancellationRequested);

        Thread = new Thread(threadStart) {Priority = ThreadPriority.Lowest};
        Thread.Start();
    }
}

因此转变为:

public void Start(ThreadPriority threadPriority = ThreadPriority.Lowest)
{
    if (!Enabled)
    {
        _threadCancellationRequested = false;

        void ThreadStart() => NotificationTimer(ref _interval, ref _ignoreDurationThreshold, ref _threadCancellationRequested);

        Thread = new Thread(ThreadStart) {Priority = ThreadPriority.Lowest};
        Thread.Start();
    }
}

后者对前者的好处是什么?它只是关于绩效吗?

我已经检查了下面的资源,但在我的例子中,好处并不那么明显:

1 个答案:

答案 0 :(得分:8)

您链接的第一个网站提到了本地功能的一些好处:
- lambda导致分配 - 编写递归lambda没有优雅的方法 - 他们不能使用yield return,也可能使用其他一些东西。

一个有用的用例是迭代器:

错误的方式:

public static IEnumerable<T> SomeExtensionMethod<T>(this IEnumerable<T> source) {
    //Since this method uses deferred execution,
    //this exception will not be thrown until enumeration starts.
    if (source == null)
        throw new ArgumentNullException();
    yield return something;
}

正确的方式:

public static IEnumerable<T> SomeExtensionMethod<T>(this IEnumerable<T> source) {
    if (source == null)
        throw new ArgumentNullException();
    return Iterator();

    IEnumerable<T> Iterator() {
        yield return something;
    }
}