1. 程式人生 > >007委託和事件

007委託和事件

委託:

  委託是什麼?
    1. 本身是一個類, 繼承自System.MulticastDelegate, 同時System.MulticastDelegate又繼承了Delegate
    2. 委託在例項化的時候, 必須傳遞一個引數, 引數就是方法的名稱; 但是這個方法的簽名(返回值型別, 引數個數)必須和委託定                   義的保持一致
    3. 呼叫的時候, 像類一樣呼叫; 但是是用例項化名加上.Invoke()來呼叫; 這個Invoke就是父類(System.MulticastDelegate)的                       方法 [反編譯使用IL就能看到]

public delegate void NoReturnNoPara(); //1 宣告委託
NoReturnNoPara method = new NoReturnNoPara(this.DoNothing);//2 委託的例項化
//通過反編譯工具ILspy, 可以發現委託反編譯之後就是一個類, 然後繼承了一個叫[mscorlib]System.MulticastDelegate的方法; 所以這裡可以直接呼叫invoke
method.Invoke();//3 委託例項的呼叫
method(); //當然可以省略掉 Invoke(); 都等同於 直接呼叫 DoNothing這個方法

 

委託做什麼?
  1. 把方法包裝成變數, 在執行委託的時候, 才開始呼叫

 

    /// <summary>
    /// 定義一個委託
    /// </summary>
    /// <param name="student"></param>
    /// <returns></returns>
    public delegate bool ThanDelegate(Student student);



    /// <summary> /// 1 type:不同的值 不同的判斷 如果再多一種 /// /// 傳個引數--判斷引數--執行對應的行為 /// 能不能直接傳遞個行為呢?邏輯就是方法,等於說是傳遞方法進來 /// student.Age > 25 這裡我們只需要傳遞這個邏輯 /// </summary> /// <param name="source"></param> /// <returns></returns> private List<Student> GetList(List<Student> source, int type) { List<Student> result = new List<Student>(); foreach (Student student in source) { if (type == 1) { if (student.Age > 25)//判斷條件 { result.Add(student);//滿足條件的放入容器 } } else if (type == 2) { if (student.Name.Length > 2) { result.Add(student); } } else if (type == 3) { if (student.Name.Length > 2 && student.Age > 25 && student.ClassId == 2) { result.Add(student); } } } return result; } /// <summary> /// 判斷邏輯傳遞進來+實現共用邏輯 /// 委託解耦, 公共邏輯和業務邏輯的耦合, 減少重複程式碼 /// </summary> /// <param name="source"></param> /// <param name="method"></param> /// <returns></returns> private List<Student> GetListDelegate(List<Student> source, ThanDelegate method) { List<Student> result = new List<Student>(); foreach (Student student in source) { if (method.Invoke(student)) { result.Add(student); } } return result; }