0

サンプルプログラムがあり、特定の順序で3つのメソッドを実行する必要があります。そして、各メソッドを実行した後、エラー処理を行う必要があります。今、私はこれを通常の方法で行いましたが、このようなデリゲートを使用していません。

クラスProgram{publicstatic 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;
    }
}

ご覧のとおり、このコードは非常に多くのtry catchループがあり、すべて同じことを行っているため、見苦しいように見えます...したがって、デリゲートを使用してこのコードをリファクタリングし、TryCatchをすべて1つのメソッドにまとめることができるようにすることにしました。きちんと見えるように。私はオンラインでいくつかの例を見ていましたが、これにActionまたはFuncのデリゲートを使用する必要があるかどうかを理解できませんでした。どちらも似ているように見えますが、これを実装する方法を明確に理解することはできません。どんな助けでもgr8lyに感謝します。私は.NET4.0を使用しているので、これにも匿名メソッドnラムダ式を使用できます

ありがとう

4

2 に答える 2

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;
    }                
 }

別の答えが言うように、これはこの単純な例ではやり過ぎになる可能性があります。ただし、たとえば、各ステップで再試行ロジックを実装したい場合など、場合によっては依然として有用です (値を計算するよりも複雑なことをしていると仮定します)。

于 2010-05-02T00:42:36.977 に答える
-1

返信ありがとうございます...私はこの解決策を思いつくことができました

@joel....ソルンのthnx...ご覧のとおり、スローされた例外はプログラムを終了できません....例外をログに記録した後も続行します..これが私のコードです。 /さらにリファクタリングする必要があります.!! 私は方法を知りません:(

これをさらに簡素化するための提案..

注:特定の関数が例外をスローした場合、全体的な結果は偽になります...しかし、他の関数の実行を続けて、他の関数が失敗するかどうかを確認します...

また、ここで言及されている関数は説明のためのものであり、実際のメソッドはより 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();
    }
}
于 2010-05-02T21:10:27.120 に答える