代码之家  ›  专栏  ›  技术社区  ›  Carlo V. Dango

功能C-使用或返回动作

  •  3
  • Carlo V. Dango  · 技术社区  · 14 年前

    为了在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;
            }
        };
    }
    

    2)在C中开发高阶函数的首选策略是什么?

    我想知道,一种方法是否比另一种方法更有效。

    3 回复  |  直到 14 年前
        1
  •  5
  •   Sorax    14 年前

    第二种情况类似于可出错的操作工厂。如果你把你想做的事情交给一个代表, protectedBlock 以及当 Exception 发生, faultHandler . 返回的操作包装在try/catch结构中,作为聚合 Action . 我对这两种方法的问题是不 例外 实际上是被抓到了,所以谁会抓住你的掷球,谁也不知道该怎么做。

    2之间的执行差异在于它们实际执行的时间。第一个将在调用时执行。第二个将在返回时执行 行动 被调用。我不认为效率差异会很明显。

        2
  •  4
  •   Craig Stuntz    14 年前

    (2)可以进一步组成,而(1)只是运行。但两者都不是“功能性”的 Action 不是函数(与 Func<A, R> )

    所以有了(2)你可以做到:

    Fault(someAction, Fault(firstTryFaultHandler, lastDitchFaultHandler))();
    

    …并获得预期的行为。这不适用于(1)

        3
  •  1
  •   Joh    14 年前

    在C中,方法2可能会令人困惑。调用者可能会使用“fault(a,b);”来期望调用a和可能的b。相反,创建、返回和丢弃lambda。换句话说,什么都不做。

    在效率方面,如果大多数调用的形式为“fault(a,b)();”,即立即调用lambda,则方法2有点浪费。在这种情况下,不需要lambda。

    基于这些原因,我更喜欢方法1。如果需要延迟执行,可以显式地引入lambda“()=>fault(a,b)”。