學習之路二十三:利用委托減少Try/Catch


前段時間利用了一點空閑時間優化了項目中的代碼,其中減少Try/Catch是這次優化的重點。

主要是參考了老A的大作:如何編寫沒有Try/Catch的程序,看了一下,老A主要介紹了怎么減少按鈕事件中的Try/Catch,不過我們項目是WCF,基本上就沒有按鈕事件,不過老A也提供了一個很好的思路,那就是利用委托動態的為每個方法加上Try/Catch,有了這個思路之后就很好做了。

核心代碼:

 1         private T InvokeHandler<T>(string clientName, string methodName, Delegate delegateWarpper, object[] parameters)
 2         {
 3             try
 4             {
 5                 //這邊關於第一個參數要注意一下
 6                 //當委托綁定的方法是靜態的,那么就可以傳“null”
 7                 //如果綁定的方法不是靜態的,就必須傳當前方法的實例才行,也就是 -- delegateWarpper.Target
 8                 //如果還不懂,直接MSDN查找,我也是看MSDN的
 9                 return (T)delegateWarpper.Method.Invoke(delegateWarpper.Target, parameters);
10             }
11             catch (TargetInvocationException exception)
12             {
13                 Console.WriteLine(exception.InnerException.Message + Environment.NewLine + exception.InnerException.StackTrace);
14             }
15             return default(T);
16         }

原有的調用方式:

 1         public List<string> GetNames(string clientName)
 2         {
 3             //如果每個方法都這樣寫,那么就要有很多相似的Try/Catch代碼
 4             //不僅寫了很多多余的代碼,有使得代碼不夠優美了
 5             try
 6             {
 7                 return new List<string>() { "12" };
 8             }
 9             catch (Exception exception)
10             {
11                 Console.WriteLine(exception.Message + Environment.NewLine + exception.StackTrace);
12             }
13             return null;
14         }

現在的調用方式:

1         public List<string> GetNames(string clientName)
2         {
3             //首先定義委托綁定的方法
4             //可以使用.NET Framework中自帶的Action和Func委托
5             Func<List<string>> func = () => new List<string> { "12" };
6             //然后調用助手方法就可以了
7             return InvokeHandler<List<string>>(clientName, "GetNames", func, null);
8         }

 

通過舊的和新的調用方式比較,發現代碼有了很大的縮減,而且從代碼整潔的角度來看新的調用方式更加優美。

這個方法不是萬能的,不過應對80%的情況還是沒有問題滴!

好了,如果園友很有什么好的看法,提出來分享下,Thanks.......  

最后祝大家2013春節快樂!

以同步至:個人文章目錄索引


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM