基础拾遗------委托详解
基礎拾遺:
基礎拾遺------特性詳解
基礎拾遺------webservice詳解
基礎拾遺------redis詳解
基礎拾遺------反射詳解
基礎拾遺------委托詳解
基礎拾遺------接口詳解
基礎拾遺------泛型詳解
基礎拾遺-----依賴注入
基礎拾遺-----數據注解與驗證
基礎拾遺-----mongoDB操作
基礎拾遺----RabbitMQ
前言:
C# 中的委托(Delegate)類似于 C 或 C++ 中函數的指針。委托是存有對某個方法的引用的一種引用類型變量。引用可在運行時被改變。委托(Delegate)特別用于實現事件和回調方法。所有的委托都派生自 System.Delegate 類。把一個方法當作參數傳遞,讓其它方法進行調用執行。
好比:今天中午不想出去,委托小明幫我帶份飯,我要買飯,但是小明幫我買的。
1.委托的聲明
委托聲明決定了可由該委托引用的方法。委托可指向一個與其具有相同標簽的方法。
1.1.delegate
1.1.1. 0-23個參數,可以有返回值也可以沒有返回值
public delegate int MyDelegateEventHandler (string parm);注:
(1).此委托指向的方法必須是參數為string類型,返回類型為int類型的。其他聲明類比所得。
(2).EventHandler是c# 命名規范,當然我理解規范就是可以隨意啦。
1.1.2.委托的多播
每個委托都只包含一個方法調用,如果調用多個方法,就需要多次顯示調用這個委托。如果同一個委托調用多個方法,我們就可以用多播委托
public delegate void MyDelegate ();public voidMyMethod() { //# } public void MyMethod1() { //# } public void MyMethod2() { //# } MyDelegateEnventHander myDelegate; myDelegate=new MyDelegateEventHander(MyMethod); myDelegate+=new MyDelegateEventHander(MyMethod1); ........... //調用 myDelegate();?注:
1.委托對象可使用 "+" 運算符進行合并;
2."-" 運算符可用于從合并的委托中移除組件委托;
3.委托指定方法類型必須一致;
4.返回類型一般為void,但非必須;
5.GetInvocationList獲取委托索引
if (MyDelegate != null) System.Delegate[] dels = MyDelegate .GetInvocationList(); for (int i = 0; i < dels.Length; i++) {MyDelegate -= dels[i] as MethodDelegate;}以上是利用GetInvocationList獲取委托索引的一個簡單應用。
1.2.Action
?Action至少0個參數,至多16個參數,無返回值。
Action 表示無參,無返回值的委托 Action<int,string> 表示有傳入參數int,string無返回值的委托 Action<int,string,bool> 表示有傳入參數int,string,bool無返回值的委托 Action<int,int,int,int> 表示有傳入4個int型參數,無返回值的委托 public void Test<T>(Action<T> action,T p){action(p);}1.3.Func
?Func至少0個參數,至多16個參數,根據返回值泛型返回。必須有返回值,不可void
Func是無返回值的泛型委托 Func<int> 表示無參,返回值為int的委托 Func<object,string,int> 表示傳入參數為object, string 返回值為int的委托 Func<object,string,int> 表示傳入參數為object, string 返回值為int的委托 Func<T1,T2,,T3,int> 表示傳入參數為T1,T2,,T3(泛型)返回值為int的委托1.4.predicate
1.4.1.predicate 是返回bool型的泛型委托;
1.4.2.predicate<int> 表示傳入參數為int 返回bool的委托;
1.4.3.Predicate有且只有一個參數,返回值固定為bool;
public delegate bool Predicate<T> (T obj)?
2.委托的實例化
2.1.delegate
public delegate int MyDelegateEventHandler (string parm) public int MyMethod(string parm) {//# }MyDelegateEventHandler MyDelegate=new MyDelegateEventHandler(MyMethod)注:委托實例化的時候,委托對象必須使用 new 關鍵字來創建,且與一個特定的方法有關。委托參數中的方法不含參數。
2.2.Action的使用
public void Test<T>(Action<T> action, T p){action(p);}private void Action(string s){#}//調用 Test<string>(Action,"wyl");2.3.Func的使用
public int Test<T1, T2>(Func<T1, T2, int> func, T1 a, T2 b) {return func(a, b); } private int Fun(int a, int b) {# } //調用 Test<int,int>(Fun,100,200)4.綜上:
4.1.委托類似于 C++ 函數指針。
4.2.委托允許將方法作為參數進行傳遞。
4.3.委托可用于定義回調方法。
4.4.委托可以鏈接在一起;多播。
4.5.方法不必與委托簽名完全匹配。
?
?
?
轉載于:https://www.cnblogs.com/kmonkeywyl/p/5688939.html
總結
以上是生活随笔為你收集整理的基础拾遗------委托详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ACM-线段树
- 下一篇: 生成元(Digit Generator