Как изменить этот код, используя действие или func делегаты

StackOverflow https://stackoverflow.com/questions/2752013

Вопрос

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

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

Спасибо

Это было полезно?

Решение 2

Спасибо за ответ ... Я смог придумать это решение

@joel .... спасибо за раствор ... Как вы можете видеть, изгнанную экспертиву не удалось заканчивать программу .... она продолжается после регистрации исключения .. Вот мой код, я все еще чувствую, что это может /Шуд будет дальнейшим рефактованным. !! Я просто не ДОННО, КАК :(

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

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top