Как изменить этот код, используя действие или 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;
}
}
Как вы можете видеть, этот код выглядит уродливо, так что многие пытаются поймать петли, которые делают то же самое ... поэтому я решил, что могу использовать делегатов для рефакторирования этого кода, чтобы попытка поднять все в одном методе так что это выглядит аккуратно. Я смотрел на некоторые примеры в Интернете и не смог понять, что мы сразимся за использование действий или делегатов 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;
}
}
Как говорит другой ответ, это может быть излишним для этого простого примера. Однако это все еще может быть полезно в некоторых случаях, например, если вы хотите реализовать некоторую логику повторения на каждом шаге (при условии, что вы делаете что -то более сложное, чем расчет значений)