如何使用Action <t>或Func <t>委托重构此代码</t> </t>

时间:2010-05-02 00:20:05

标签: .net-3.5 delegates action func

我有一个示例程序,需要按特定顺序执行3个方法。 并且在执行每个方法之后,应该进行错误处理。现在我以正常的方式做到这一点,没有使用这样的代表。

课程计划     {         public static void Main()         {

        MyTest();
    }

    private static bool MyTest()
    {

        bool result = true;
        int m = 2;
        int temp = 0;

        try
        {
            temp = Function1(m);
        }
        catch (Exception e)
        {
            Console.WriteLine("Caught exception for function1" + e.Message);
            result = false;
        }

        try
        {
            Function2(temp);
        }
        catch (Exception e)
        {
            Console.WriteLine("Caught exception for function2" + e.Message);
            result = false;
        }

        try
        {
            Function3(temp);
        }
        catch (Exception e)
        {
            Console.WriteLine("Caught exception for function3" + e.Message);
            result = false;
        }

        return result;
    }

    public static int Function1(int x)
    {
        Console.WriteLine("Sum is calculated");
        return x + x;
    }

    public static int Function2(int x)
    {
        Console.WriteLine("Difference is calculated ");
        return (x - x);
    }

    public static int Function3(int x)
    {
        return x * x;
    }
}

正如你所看到的,这段代码看起来很丑陋,有很多尝试catch循环,它们都做同样的事情......所以我决定我可以使用委托来重构这段代码,以便Try Catch可以全部推送一个方法,使它看起来整洁。我在网上看了一些例子,无法想象我们是否会为此使用Action或Func代表。两者看起来相似,但我无法清楚地知道如何实现这一点。任何帮助都非常感谢。我正在使用.NET 4.0,所以我允许使用匿名方法n lambda表达式也用于此

由于

2 个答案:

答案 0 :(得分:4)

bool result = true;
int m = 2;
int temp = 0;

var funcs = new Func<int, int>[]{
                          x =>
                              {
                                  Console.WriteLine("Sum is calculated");
                                  return x + x;
                              },
                          x =>
                              {
                                  Console.WriteLine("Difference is calculated");
                                  return x - x;
                              },
                          x => x * x
                      };

temp = m;
foreach (var func in funcs)
{
    try
    {
        temp = func(m);
    }
    catch (Exception e)
    {
        Console.WriteLine("Caught exception:" + e.Message);
        result = false;
    }                
 }

就像另一个答案所说的那样,对于这个简单的例子来说,这可能是过度的。但是在某些情况下它仍然有用,例如,如果你想在每一步都实现一些重试逻辑(假设你做的事情比计算值更复杂)

答案 1 :(得分:-1)

感谢您的回复......我能够提出这个解决方案

@joel .... thnx for soln ...正如你所看到的,抛出的excpetion无法终止程序....它在记录异常后继续shud ... 这是我的代码 不知何故,我觉得这可以/ shud进一步重构。!!我只是不知道如何:(

任何进一步简化此事的建议......

注意:如果某个特定函数抛出一个异常,整个结果就会出错......但是shud继续执行其他函数来查看是否有其他函数失败......

此外,这里提到的func仅用于说明,实际方法更多是cmplx

class Program
{
    public static void Main()
    {
        ExecuteTask task1 = Function1;
        ExecuteTask task2 = Function2;
        ExecuteTask task3 = Function3;
        bool result = true;
        int param1 = 2, param2 = 3, param3 = 4;

        MyTest(task1, ref result, ref param1);
        MyTest(task2, ref result, ref param2);
        MyTest(task3, ref result, ref param3);

        Console.WriteLine("final result is " + result.ToString());
        Console.ReadLine();
    }

    private delegate void ExecuteTask(ref int x);

    private static void MyTest(ExecuteTask task, ref bool result1, ref int param1)
    {

        try
        {
            task(ref param1);
        }
        catch (Exception e)
        {
            Console.WriteLine("Caught exception for " + e.Message);
            result1 = false;
        }

        return result1;
    }

    public static void Function1(ref int x)
    {
        Console.WriteLine("Sum is calculated");
        x = x + x;
    }

    public static void Function2(ref int x)
    {
        Console.WriteLine("Difference is calculated ");
        x = (2 * x - x);
    }

    public static void Function3(ref int x)
    {
        //Console.WriteLine("Product is calculated ");
        //x = x * x;
        throw new ArgumentOutOfRangeException();
    }
}