委托避免重复的try.catch的随笔【转载】_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 委托避免重复的try.catch的随笔【转载】

委托避免重复的try.catch的随笔【转载】

 2014/11/8 21:07:21  MakeCoder  程序员俱乐部  我要评论(0)
  • 摘要:读了一位博友关于使用委托避免重复的try.catch的随笔(原文地址:http://www.cnblogs.com/foolishfox/archive/2010/07/30/1788416.html),有点感想,写下来与大家分享.补充一下原文的例子:publicclassCatchExceptions{///<summary>///捕获异常的方法///</summary>///<paramname="func">绑定到委托的方法</param>
  • 标签:随笔

读了一位博友关于使用委托避免重复的try.catch的随笔(原文地址:http://www.cnblogs.com/foolishfox/archive/2010/07/30/1788416.html),有点感想,写下来与大家分享.

补充一下原文的例子:

class="csharp keyword">public class CatchExceptions {     /// <summary>     /// 捕获异常的方法     /// </summary>     /// <param name="func">绑定到委托的方法</param>     /// <returns>异常信息,如果为空则没有产生异常</returns>     public static string TryCatch(Action func)     {         string runMsg = string.Empty;           try         {             func();         }         catch (Exception ex)         {             runMsg = ex.Message;         }           return runMsg;     }       /// <summary>     /// 捕获异常的方法     /// </summary>     /// <typeparam name="T">委托的参数类型</typeparam>     /// <param name="func">绑定到委托的方法</param>     /// <param name="param">委托的参数实例</param>     /// <returns>异常信息,如果为空则没有产生异常</returns>     public static string TryCatch<T>(Action<T> func, T param)     {         string runMsg = string.Empty;           try         {             func(param);         }         catch (Exception ex)         {             runMsg = ex.Message;         }           return runMsg;     }       /// <summary>     /// 捕获异常的方法     /// </summary>     /// <typeparam name="T1">委托的第一个参数类型</typeparam>     /// <typeparam name="T2">委托的第二个参数类型</typeparam>     /// <param name="func">绑定到委托的方法</param>     /// <param name="param1">委托的第一个参数实例</param>     /// <param name="param2">委托的第二个参数实例</param>     /// <returns></returns>     public static string TryCatch<T1, T2>(Action<T1, T2> func, T1 param1, T2 param2)     {         string runMsg = string.Empty;           try         {             func(param1, param2);         }         catch (Exception ex)         {             runMsg = ex.Message;         }           return runMsg;     } }

原文使用的是Func而此处使用的是Action,到底Func和Action有什么区别呢?

Action委托 表示 封装一个方法,该方法不具有参数并且不返回值

Action<T>委托 是Action的泛型委托 表示封装一个方法,该方法拥有一个参数并且不返回值

Action<T>委托多参数的形式为 Action<T1,T2,T3.....> 且最多只能有16个参数

再来看看Func委托.

Func<TResult>委托 表示 封装一个没有参数但返回TResult类型的值的方法

Func<T,TResult>委托 表示 封装一个有一个参数但返回TResult类型的值的方法

Func<T,TResult>的多参数形式为 Func<T1,T2,T3.....,TResult> 且最多只能有16个参数

所以上述TryCatch方法的参数到底用Action还是Func取决于实际的使用情况,如果需要绑定到委托的方法有返回值,使用Func,如果没有返回值,则使用Action

方法定义好了,如果调用呢?

这里我们定义一个有参数的方法和一个无参的方法

private void DeleteObj(int objID) {     //主体省略... }    private void AddObj() { //主体省略... }

分别在添加和删除Button的OnClick()方法中调用

protected void btnSave_Click(object sender, EventArgs e) {     string runMsg = CatchExceptions.TryCatch(AddObj);     Response.Write(runMsg.Length > 0 ? "添加失败!" + runMsg : "添加成功"); }    protected void btnDelete_Click(object sender, EventArgs e) {     string runMsg = CatchExceptions.TryCatch(DeleteObj,objID);     Response.Write(runMsg.Length > 0 ? "删除失败!" + runMsg : "删除成功"); }
发表评论
用户名: 匿名