功能C# - 使用或恢复操作的
-
26-09-2019 - |
题
浏览网在C#中更好的故障处理,我已经遇到一些以下,以实施策略。第一个是自然的我,而其他实现我不确定什么它的优点是?
1)
static void Fault(Action protectedBlock, Action faultHandler)
{
try
{
protectedBlock();
}
catch
{
faultHandler();
throw;
}
}
2)
static Action Fault(Action protectedBlock, Action faultHandler)
{
return () =>
{
try
{
protectedBlock();
}
catch
{
faultHandler();
throw;
}
};
}
在C#显影高阶函数时是2)的优选策略?
和,我想知道,如果一种方法是比另一个更有效。
解决方案
在第二种情况下是像Faultable行动厂。当你在你想做的事情,protectedBlock
什么代表,以及当发生Exception
做什么,faultHandler
委托传递。该行动将返回包裹在一个try / catch结构作为骨料Action
。我用这两种方法的问题是实际上是被抓到没有Exception
所以谁曾会赶上你扔有其行事的任何信息。
在2之间执行的差别是当他们实际执行。当它被称为第一次将被执行。每当返回Action
被称为第二个将被执行。我不认为效率差别是显著。
其他提示
(2)可以进一步由,而(1)刚运行。但既不是完全“功能”作为Action
不是(与Func<A, R>
比较)。
因此,与(2)你可以这样做:
Fault(someAction, Fault(firstTryFaultHandler, lastDitchFaultHandler))();
...并获得预期的行为。不工作与(1)
在C#,方法2可被混淆。呼叫者可以使用 “故障(A,B);”期待和可能B到被调用。相反,一个lambda创建,返回并丢弃。换句话说什么都不做。
关于效率,方法2是有点浪费如果大多数的呼叫的形式为“故障(A,B)();”,即在调用拉姆达立即。在这种情况下,你不需要一个lambda。
由于这些原因,我会如果需要延迟执行偏爱的方法1.,可以明确地引入一个拉姆达 “()=>故障(A,B)”。
不隶属于 StackOverflow