2010-05-02 72 views
0

我有一個示例程序,它需要執行3個特定順序的方法。 並執行每個方法後,應該做錯誤處理。現在我以正常的方式做到了這一點,無需使用這樣的代表。我如何重構此代碼通過使用動作<t>或Func <t>代表

類節目 { 公共靜態無效的主要(){

 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可以全部推入一種方法,使其看起來整潔。我正在看一些在線的例子,如果我不喜歡使用Action或Func代表來做這個事情,我們可能會想到。兩者看起來都很相似,但我無法弄清楚如何實現這一點。任何幫助grglyly讚賞。我使用.NET 4.0,所以即時通訊允許使用匿名方法ňlambda表達式也爲這個

感謝

回答

-1

感謝您的迴應......我能拿出這個解決方案

@joel .... thnx爲soln ...正如你所看到的,excpetion拋出不能終止程序....它記錄異常後繼續打continue .. here是我的代碼 我不知何故仍然覺得這可以/可以進一步重構。我只是唐諾如何:(

任何建議,爲進一步簡化這個..

注意:如果一個特定功能拋出一個異常,總的結果shud是假的......但shud執行其他的FUNC的,看看任何其他FUNC失敗...

而且,這裏所說的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(); 
    } 
} 
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

很好的回答(這是喬爾的),但我不會命名的數組'Func <>''s作爲「actions」,因爲這意味着一個'Action <>'的數組,這可能有點令人困惑,特別是那些對兩者之間的差異仍然有點模糊的人。我會用「funcs」或「functions」。 @ user330612:不同之處在於'Func <>'返回一個值,而'Action <>'沒有。 – 2010-05-02 09:53:23

+0

你可以看看我的回覆,看看我是否可以使用func <>來進一步簡化嗎?我現在發佈diff bw謂詞,動作和func :) thnx – user330612 2010-05-02 21:11:45