使用方法: 給委托賦值的幾種方式 //調用委托的方法 noreturn.Invoke() 上面展示的是委托的基本定義於使用方法,在mvc中基本摒棄了這種寫法,轉而使用封裝好的泛型委托來使用 使用方法: 下麵寫幾個簡單的demo演示一下 下麵來調用這個方法,看一下委托的具體使用方法 上面就是一個簡單但 ...
使用方法:
//無返回值無參數委托的定義方法 public delegate void NoReturnPara();
補充一下:
public void DoNothing() { // 沒有參數,沒有返回值 }
給委托賦值的幾種方式
//實例化委托,並傳入方法 NoReturbNoPara noreturn = new NoReturbNoPara(this.DoNothing); //LinqToObject NoReturbNoPara noreturn = () => { }; //直接賦值 NoReturbNoPara noreturn = this.DoNothing;
//調用委托的方法
noreturn.Invoke()
上面展示的是委托的基本定義於使用方法,在mvc中基本摒棄了這種寫法,轉而使用封裝好的泛型委托來使用
使用方法:
//無返回值,無參數委托,不需要單獨聲明 Action act = this.DoNothing;
//無返回值,有參數委托,參數類型為泛型 Action<string> act = p => { };
//返回類型為string,參數類型為string的委托 Func<string,string> func = p => p; //返回類型為bool,參數類型為string的委托 Func<string,bool> func = p => p.Equals('');
下麵寫幾個簡單的demo演示一下
/// <summary> /// 擴展方法 /// </summary> public static class DelegateExtend { /// <summary> /// 模仿Linq的Where操作 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="scoure">數據源</param> /// <param name="func">委托(自定義bool條件)</param> /// <returns></returns> public static IEnumerable<T> ExtWhere<T>(this IEnumerable<T> scoure, Func<T, bool> func) { //遍曆數據源的數據 foreach (var item in scoure) { //請求委托完成條件的篩選返回bool bool bResult = func(item); //把通過篩選提交的數據源,返回出去 if (bResult) { yield return item; } } } }
下麵來調用這個方法,看一下委托的具體使用方法
/// <summary> /// 實體模型 /// </summary> public class Student { /// <summary> /// ID /// </summary> public string Id { get; set; } /// <summary> /// 名稱 /// </summary> public string Name { get; set; } }
//查詢出所有數據 IEnumerable<Student> student = sql.QueryList<Student>(); //定義一個匿名方法,並賦值給委托 Func<Student, bool> func = delegate(Student s) { //自定義代碼邏輯,返回bool類型 return s.Id.Equals("1"); }; //傳入委托 IEnumerable<Student> list = student.ExtWhere(func); //第二種方法,使用linq語法(自定義邏輯) IEnumerable<Student> list1 = student.ExtWhere(p => p.Id.Equals("1"));
上面就是一個簡單但很常見的委托使用場景
我剛開始的時候,對委托的理解覺得很困難,總感覺暈暈的,但是自己沒事多練習練習之後,就會很好理解了
下麵總結一下使用委托的好處
解耦:抽出自定義邏輯,保留相同的邏輯,使代碼分離
最大限度的簡化代碼:解耦的同時,又減少了代碼量