使用lambda表达式与私有方法

Ben*_*ins 18 .net c# lambda

我读了一个关于Stack Overflow问题的答案,其中包含以下建议代码:

Action<Exception> logAndEat = ex => 
{  
    // Log Error and eat it
};

try
{
    // Call to a WebService
}
catch (SoapException ex)
{
    logAndEat(ex);
}
catch (HttpException ex)
{
    logAndEat(ex);
}
catch (WebException ex)
{
    logAndEat(ex);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:对于LogAndEat使用lambda表达式而不是(在我看来更简单,更明显)私有方法的优点(如果有的话)是什么,如下所示:

private void LogAndEat(Exception ex)
{
    // Log Error and eat it
}
Run Code Online (Sandbox Code Playgroud)

编辑:感谢您的答案到目前为止,但只是更清楚地重述我的基本问题:哪种方法更好/您会在这种情况下推荐?lambda表达式还是私有方法?

Mat*_*ton 13

我想你可以认为这个例子中的lambda表达式有点像Pascal的嵌套函数,因为它的代码只能通过它声明的方法来执行.

可以从同一个类中的任何方法调用私有方法,而像这样的lambda是当前方法的本地方法,因此显式仅在该上下文中使用.

这是我能想到的唯一优势 - 在预期用途方面明确.


Bry*_*tts 9

logAndEat否则捕获的变量将是该LogAndEat方法的参数.你可以认为它是一种形式的讨论.


Ben*_*ins 1

感谢大家为我投了赞成票的精彩答案,但我想我应该总结一下它们,以尝试在一个答案中捕捉其优点和缺点。

使用 lambda 表达式 (LE) 而不是私有方法的优点:

  • LE 的作用域是在其中声明它的方法,因此如果它仅由该方法使用,则该意图通过 lambda 表达式显式表达(即使可以将委托传递给 LE,人们仍然可以争论在方法中声明 LE 的目的是使 LE 的作用域限于该方法)。也就是说,明确其预期用途。
  • Lambda 表达式的行为类似于闭包,因此它们可以访问声明它们的方法范围内的变量。这比将大量参数传递给私有方法更简洁。
  • 否则,LE 捕获的变量将成为私有方法的参数,并且可以利用这一点来允许某种形式的柯里化。

使用 lambda 表达式而不是私有方法的缺点:

  • 由于 LE 可以访问范围仅限于包含变量的方法的变量,因此在调试时不可能修改调用方法中的代码。

还有一个更主观的可维护性问题,有人可能会说,大多数开发人员对 LE 的理解不如私有方法,因此可维护性稍差。人们还可能认为 LE 提高了可维护性,因为它封装在调用它的方法中,而不是对整个类可见的私有方法。