1. 程式人生 > >通過例項理解委託、lambda的演變

通過例項理解委託、lambda的演變

經過一段時間的學習,想寫個部落格記錄一下委託、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);
        
        }

    }
}