Как мне изменить этот код с помощью делегатов Action <t>или Func <t> - PullRequest
0 голосов
/ 02 мая 2010

У меня есть пример программы, которая должна выполнить 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;
    }
}

Как вы можете видеть, этот код выглядит безобразно с таким большим количеством циклов try catch, которые все делают одно и то же ... поэтому я решил, что могу использовать делегатов для рефакторинга этого кода, так что Try Catch может быть заброшен в один метод, чтобы он выглядел аккуратно. Я смотрел на некоторые примеры в Интернете и не мог понять, будем ли я использовать для этого делегатов Action или Func. Оба выглядят одинаково, но я не могу понять, как это реализовать. Любая помощь приветствуется. Я использую .NET 4.0, поэтому им разрешено использовать анонимные методы и лямбда-выражения также для этого

Спасибо

Ответы [ 2 ]

4 голосов
/ 02 мая 2010
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;
    }                
 }

Как говорит другой ответ, это может быть излишним для этого простого примера. Однако в некоторых случаях это может быть полезно, например, если вы хотите реализовать некоторую логику повторения на каждом шаге (при условии, что вы делаете что-то более сложное, чем вычисление значений)

0 голосов
/ 03 мая 2010

Спасибо за ответ ... Мне удалось найти это решение

@ joel .... thnx для soln ... как видите, выброшенное исключение не может завершить программу .... оно должно продолжаться после регистрации исключения .. вот мой код Я как-то до сих пор чувствую, что это может / шуд быть подвергнуто дальнейшему рефакторингу. !! я просто не знаю как: (

любые предложения по дальнейшему упрощению этого ..

Примечание. Если определенная функция выдает исключение, общий результат должен быть ложным ... но он должен продолжать выполнять другие функции, чтобы проверить, не сработает ли какая-либо другая функция ...

Кроме того, функция, упомянутая здесь, только для иллюстрации, реальные методы более 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();
    }
}
...