zoukankan      html  css  js  c++  java
  • 利用委托减少Try/Catch

    http://www.cnblogs.com/yangcaogui/archive/2013/02/03/2890862.html

    前段时间利用了一点空闲时间优化了项目中的代码,其中减少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春节快乐!

    以同步至:个人文章目录索引

     
     
  • 相关阅读:
    Leetcode 33.搜索旋转排序数组
    Leetcode 32.最长有效括号
    Leetcode 31.下一个排列
    Leetcode 30.与所有单词相关联的子串
    Leetcode 25.k个一组翻转链表
    Leetcode 24.两两交换链表中的节点
    做数据分析需要“搞”人?
    求职互联网数据分析,如何准备行业知识?
    如何利用Social Listening从社会化媒体中“提炼”有价值的信息?
    运营实操|如何利用微信后台数据优化微信运营
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2891718.html
Copyright © 2011-2022 走看看