什麼是委託委託是沒有方法體的,聲明委託就是一個關鍵字: delegate ,委託能夠試有參無參,有返回值無返回值。和咱們的方法是同樣的。不一樣的區別是 委託沒有方法體的,委託可放在類下也能夠放在類的外面和類同等級。委託能夠說是一個類型。api
委託的聲明: 學習
//聲明委託: public delegate int Parameter(int Para); public delegate void NoParameter(); public class Commondelegate { //聲明委託: public delegate int Parameter(int Para); public delegate void NoParameter(); }
委託的實例化:spa
咱們能夠把委託看做一個幫工每一個幫工都有各自的特長,這個幫工當你不告訴他要作什麼的時候,他就不知道要作點什麼,可是你使用他了,你就必需要指定他去作什麼。不指定他去作什麼然你就白花錢了,由於沒有出活,幫工白請了。放到程序裏就是報錯了。委託是一個類也能夠被實例化,他在實例化的時候須要給定參數。這個參數就是對應的方法。code
//委託實例化 NoParameter noParameter = new NoParameter(Program.NoParameter); Parameter parameter = new Parameter(Program.Parameter); /// <summary> /// 無參無返回值方法 /// </summary> public static void NoParameter() { } /// <summary> /// 有參有返回值方法 /// </summary> /// <param name="Para"></param> /// <returns></returns> public static int Parameter(int Para) { return Para; }
上面的代碼中:咱們能夠看到,委託的實例化目的就是爲了調用某一個方法。可是咱們這樣寫的話,每使用一個相同的方法(注:參數相同,返回值相同,方法名不一樣的方法,也就是聲明委託時委託的類型)都須要去事先建立這樣的一個方法。這樣會又不少冗餘的代碼出現。blog
咱們換一種方法來實現上面的代碼:get
//委託實例化去執行方法: NoParameter noParameterNew = new NoParameter( delegate () { Console.WriteLine("我是:無參無返回值方法"); } ); Parameter parameterNew = new Parameter( delegate (int Para) { Console.WriteLine("我是:有參有返回值方法"); return Para; } );
上面的代碼實現了一樣的結果:這其實就是委託了一個匿名方法去實現了功能。可是這種寫法不少老前輩在工做的時候會寫過,由於這多是在Net 1.0/2.0的時候版本升級前的寫法,後來出現了lambda 表達式,代碼是這樣寫的。it
//使用lambda 表達式 NoParameter noParameterNew1 = new NoParameter( () => { Console.WriteLine("我是:無參無返回值方法"); } ); Parameter parameterNew1 = new Parameter( (int Para) => { Console.WriteLine("我是:有參有返回值方法"); return Para; } );
上面的代碼中使用 => // gose to 代替了delegate 這個時候咱們看到 => 的時候就很熟悉了lambda 是咱們常常會使用的. 其實lambda 更是一個匿名方法。咱們還能夠進化一下,當方法體只有一行的時候能夠這樣寫。io
咱們再換一種實現方式:class
//使用lambda 表達式 NoParameter noParameterNew1 = new NoParameter( () => Console.WriteLine("我是:無參無返回值方法") ); Parameter parameterNew1 = new Parameter( (Para) => Para );
上面的代碼 中執行有參數的時候咱們能夠看到咱們的參數並無去聲明參數類型,委託會自動幫咱們去推算了。lambda
其實咱們還能夠去這樣寫。
//使用lambda 表達式 NoParameter noParameterNew1 =() => Console.WriteLine("我是:無參無返回值方法"); Parameter parameterNew1 = (Para) => Para; Parameter parameterNew2 = Para => Para;
上面的代碼咱們在看的時候,就愈來愈熟悉了,第一眼看過去你就會覺得是lambda吧,其實=號後面的代碼是lambda,前面的仍是委託的實例。其實咱們大多數狀況下是能夠不用去聲明委託的,系統已經給咱們準備好了兩個方法供咱們使用:
Action; 無返回值委託最多可接收參數 16 個
Func; 有返回值委託,最多可接收參數16個 外加一個返回值參數。
https://docs.microsoft.com/en-us/dotnet/api/system.action?redirectedfrom=MSDN&view=netframework-4.7.2 官方的鏈接有詳細的介紹。
上面的代碼很簡單,沒有去深刻的去說一些東西。
有不足之處 但願你們指出相互學習,
本文原創:轉載請註明出處 謝謝!