通過例項理解委託、lambda的演變
阿新 • • 發佈:2018-11-16
經過一段時間的學習,想寫個部落格記錄一下委託、lambda的學習理解過程,方便自己可以回憶知識點。如果有地方有問題,請各位大佬指點一下~~~~~
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 { public delegate void mydelegate();//宣告一個無引數、返回值的委託 public delegate int mydelegate2();//宣告一個返回值為int,無引數的的委託 public delegate int mydelegate3(int x, int y);//宣告一個引數為int,返回值為int的委託 class Program { static void Main(string[] args) { mydelegate del = new mydelegate(M1);//在委託中實名註冊了個M1命名方法 del(); mydelegate del4 = delegate() { Console.WriteLine("ok"); };//建立一個委託例項,裡面包含一個匿名方法 del4(); mydelegate2 del2 = new mydelegate2(M2); var a = del2(); Console.WriteLine(a); mydelegate3 del3 = new mydelegate3(M3); var b = del3(4, 5); Console.WriteLine(b); Action act = new Action(M1);//系統內建委託Action方法,無返回值,無引數 act(); Action<int> act2 = new Action<int>(M4);//系統內建委託Action<>泛型方法,16個引數並且沒有返回值 act2(44); Func<int, int, int> fun =new Func<int,int,int>(M3);//系統內建委託Func<>,16個引數,並且返回Tresult引數指定型別的值 Console.WriteLine(fun(3,4)); Func<int, int, int> funn = delegate(int x, int y) { return x + y; }; Console.WriteLine(funn(3, 4)); Func<int> fun2 = new Func<int>(M2); Console.WriteLine(fun2()); //lambda表示式的由來 mydelegate3 mylambda = delegate(int x, int y){ return x+y;};//匿名方法 mydelegate3 mylambda1 =(int x,int y)=>{return x+y;}; //lambda第一步簡化,把匿名方法表示式中的delegate關鍵字去掉在引數和方法體之間加入=>lambda運算子讀作gose to mydelegate3 mylambda2 = (x,y)=>{return x+y;};//編譯器可以從委託的宣告中知道委託的型別,從而可以在簡化 ,省去引數型別(即使用 隱式型別) mydelegate3 mylambda3 = (x,y)=>x+y;//如果lambda表示式只有一個引數,可以省略圓括號,lambda表示式的方法主題可以是語句塊或表示式,如果是一個包含一條return表示式的語句塊,可以將語句塊替換為return關鍵字後面的表示式。 Func<int, int, int> fun3 = new Func<int, int, int>((int x, int y) => { return x + y; }); int d = fun3(4, 5); Func<int, int, int> func4 = new Func<int, int, int>((x, y) => { return x + y; }); int n = fun3(4, 5); Func<int, int, int> func5 = (x, y) => { return x + y; }; Func<int, int, int> func9 = (x, y) => x + y; Console.WriteLine( func9(98,45)); dosometing((x, y) => { return x + y; }, 4, 4);//當引數是委託時,我們可以傳委託、匿名方法、lambda表示式 dosometing(delegate(int x ,int y){return x+y;},4,4); dosometing(M3,4,4); Console.ReadKey(); } static void M1() { Console.WriteLine("ok"); } static void M4(int x) { Console.WriteLine(x); } static int M2() { return 3; } static int M3(int x, int y) { return x + y; } static void dosometing<T>(Func<T,T,T> fn ,T x ,T y) {//委託當做引數使用 T res= fn(x,y); Console.WriteLine(res); } } }