作為一個初學者,寫下來是當做自己的學習筆記,希望在以後遇到問題的時候能夠快速的找到方法
如果能幫助跟我一樣的新人是更好不過的了 如果有什麼不正確或者可以改進的地方也希望大家能夠指出來 謝謝大家
來百度一下什麼是委托:委托是一個類,它定義了方法的類型,使得可以將方法當作另一個方法的參數來進行傳遞,這種將方法動態地賦給參數的做法,可以避免在程序中大量使用If-Else(Switch)語句,同時使得程序具有更好的可擴展性。(百度百科)
先來寫個簡單的委托:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 { class Program { //聲明沒有參數,沒有返回值的委托 public delegate void MyDelegate(); //委托對象 static MyDelegate myDelegate; public static void Show() { Console.WriteLine("我的代理"); } static void Main(string[] args) { myDelegate = new MyDelegate(Show);//實例化委托 委托myDelegate去做Show的事情 myDelegate();//調用myDelegate Console.ReadKey(); } } }
將上面的改為帶參數,帶返回值的委托
class Program { //聲明帶參數,帶返回值的委托 public delegate string MyDelegate(string data); //委托對象 static MyDelegate myDelegate; public static string Show(string data) { return data; } static void Main(string[] args) { myDelegate = new MyDelegate(Show);//實例化委托 委托myDelegate去做Show的事情 Console.WriteLine(myDelegate("委托的參數"));//在調用時,需要帶上參數 Console.ReadKey(); } }
現在我們寫兩個方法
class Program { //聲明帶參數,帶返回值的委托 public delegate void MyDelegate(); //委托對象 static MyDelegate myDelegate; public static void ShowOne() { Console.WriteLine("委托一號"); } public static void ShowTwo() { Console.WriteLine("委托二號"); } }
我們現在想輸出兩個中的一個 可以改成這樣 順便復習一下帶參數的委托
class Program { //聲明帶參數的委托 public delegate void MyDelegate(string data); //委托對象 static MyDelegate myDelegate; public static void Show(string data) { switch (data) { case "委托一號": Console.WriteLine("委托一號"); break; case "委托二號": Console.WriteLine("委托二號"); break; } } static void Main(string[] args) { myDelegate = new MyDelegate(Show); myDelegate("委托一號");//調用時的參數是什麼就會輸出對應的委托了 Console.ReadKey(); } }
什麼委托一號 什麼委托二號 這個好記 要是選項多了 東西又不太好記怎麼辦 稍微改進一下
/// <summary> /// 1是委托一號 2是委托二號 /// </summary> enum DATA { zero, NumOne, NumTwo, }; class Program { //聲明帶參數的委托 public delegate void MyDelegate(DATA data); //委托對象 static MyDelegate myDelegate; public static void Show(DATA data) { switch (data) { case DATA.NumOne: Console.WriteLine("委托一號"); break; case DATA.NumTwo: Console.WriteLine("委托二號"); break; } } static void Main(string[] args) { myDelegate = new MyDelegate(Show); myDelegate(DATA.NumTwo); Console.ReadKey(); } }
是不是瞬間感覺高大上了 還有要活用/// <summary> /// </summary> 這可是好東西 可以讓別人用你代碼的時候更加的清楚用的是什麼有什麼用處 可以提高代碼的可讀性哦
如果我們希望兩個方法同時輸出該怎麼做呢 應該這樣:
class Program { //聲明帶參數,帶返回值的委托 public delegate void MyDelegate(); //委托對象 static event MyDelegate myDelegate;//此處與上面不同哦 public static void ShowOne() { Console.WriteLine("委托一號"); } public static void ShowTwo() { Console.WriteLine("委托二號"); } static void Main(string[] args) { myDelegate = new MyDelegate(ShowOne);//先給你對象賦上一個方法 myDelegate += new MyDelegate(ShowTwo);//再給你加上一個方法 myDelegate();//調用 Console.ReadKey(); } }
看下輸出 調用一個 兩個同時都顯示出來了 沒錯這就是事件(event)
事件可以加 那能不能減呢 聰明 你沒有猜錯 當然可以 改完後看下結果
static void Main(string[] args) { myDelegate = new MyDelegate(ShowOne);//先給你對象賦上一個方法 myDelegate += new MyDelegate(ShowTwo);//再給你加上一個方法 myDelegate();//調用 Console.WriteLine("__________________________我來分割________________________"); myDelegate -= new MyDelegate(ShowOne); myDelegate();//減完後再調一次 Console.ReadKey(); }
委托和事件說完了 來看看特別一點的 匿名方法
在之前 每次實例化委托的時候都要有一個已經寫好的方法 而匿名方法則不需要
class Program { //聲明帶參數的委托 public delegate void MyDelegate(string data); //委托對象 static MyDelegate myDelegate; static void Main(string[] args) { myDelegate = delegate(string data) //帶參數 { Console.WriteLine(data); }; myDelegate("帶參數的匿名方法"); Console.ReadKey(); } }
不帶參數的只要將參數去掉即可 delegate後面跟上你需要用的參數在{}中進行你需要的操作 最後不要忘記帶上分號哦
要是匿名方法還不夠快 那試試這個
class Program { //聲明帶參數的委托 public delegate void MyDelegate(string data); //委托對象 static MyDelegate myDelegate; static void Main(string[] args) { myDelegate = (string data) => { Console.WriteLine(data); }; myDelegate("帶參數Lambda表達式"); Console.ReadKey(); } }
代碼量是不是更少了呢 直接用小括號寫上參數,然後是=> 再用個{}來框住你的操作 同樣最後也有分號
先來看看它的解釋
參數可以有好多也可以沒有 但是 他沒有返回值 來看看怎麼用吧
class Program { //不帶參數的Action static Action actionOne; //帶參數的Action static Action<string> actionTwo; static void Main(string[] args) { actionOne = new Action(ShowOne); actionOne(); actionTwo = new Action<string>(ShowTwo); actionTwo("Action ShowTwo"); Console.ReadKey(); } static void ShowOne() { Console.WriteLine("Action ShowOne\n"); } static void ShowTwo(string data) { Console.WriteLine(data); } }
試著輸出一下吧
它與Action類似 但是他是必須帶返回值的
前面的都是它的參數, 最後一個參數就是他的返回值
//不帶參數的Action static Func<string> FuncOne; //帶參數的Action static Func<string,string> FuncTwo; static void Main(string[] args) { FuncOne = new Func<string>(ShowOne); Console.WriteLine(ShowOne()); FuncTwo = new Func<string, string>(ShowTwo); Console.WriteLine(ShowTwo("Func ShowTwo")); Console.ReadKey(); } static string ShowOne() { return "Func ShowOne\n"; } static string ShowTwo(string data) { return data; }
大家試著自己輸出吧 畢竟程序還是要多練的哦