.net中的各類委託(Delegate、Action、Func)

一、Delegate,委託的鼻祖spa

 

        protected delegate int ClassDelegate(int x, int y);//定義委託類型及參數
        static void Main(string[] args)
        {
            ClassDelegate dele = new ClassDelegate(Add);//實例化一個委託

            Console.WriteLine(dele(1, 2));//調用委託
            Console.ReadKey();
        }

        static int Add(int a, int b)
        {
            return a + b;
        }

 

 

二、Action,能夠傳入參數,沒有返回值的委託code

方法1,調用方法blog

        static void Main(string[] args)
        {
            Action<int, int> ac = new Action<int, int>(ShowAddResult);//實例化一個委託
            ac(1, 2);//調用委託

            Console.ReadKey();
        }

        static void ShowAddResult(int a, int b)
        {
            Console.WriteLine(a + b);
        }

 

方法2,使用lambda表達式input

        static void Main(string[] args)
        {
            Action<int, int> ac = ((p, q) => Console.WriteLine(p + q));//實例化一個委託
            ac(1, 2);//調用委託

            Console.ReadKey();
        }

 

方法3,做爲參數傳string

        static void Main(string[] args)
        {
            Action<string> ac = (p => Console.WriteLine("我是方法1,傳入值:"+p));//實例化一個委託
            Action<string> ac2 = (p => Console.WriteLine("我是方法2,傳入值:" + p));//實例化另外一個委託

            Test(ac, "參數1");//調用test方法,傳入委託參數
            Test(ac2, "參數1");//調用test方法,傳入委託參數

            Console.ReadKey();
        }

        static void Test<T>(Action<T> ac, T inputParam)
        {
            ac(inputParam);
        }

 

 

 

三、Func,能夠傳入參數,必須有返回值的委託it

 方法1,調用方法io

        static void Main(string[] args)
        {
            Func<string> fc1 = new Func<string>(ShowAddResult);//實例化一個委託
            string result = fc1();//調用委託

            Console.WriteLine(result);
            Console.ReadKey();
        }
        static string ShowAddResult()
        {
            return "地球是圓的";
        }

 

方法2,使用lambda表達式class

        static void Main(string[] args)
        {
            //實例化一個委託,注意不加大括號,寫的值就是返回值,不能帶return
            Func<string> fc1 = () => "地球是圓的";

            //實例化另外一個委託,注意加大括號後能夠寫多行代碼,可是必須帶return
            Func<string> fc2 = () =>
            {
                return "地球是圓的";
            };

            string result = fc1();//調用委託
            string result2 = fc2();//調用委託

            Console.WriteLine(result);
            Console.WriteLine(result2);
            Console.ReadKey();
        }

 

方法3,做爲參數傳test

        static void Main(string[] args)
        {
            //實例化一個委託,注意不加大括號,寫的值就是返回值,不能帶return
            Func<int, string> fc1 = (p) => "傳入參數" + p + ",地球是圓的";

            //實例化另外一個委託,注意加大括號後能夠寫多行代碼,可是必須帶return
            Func<string, string> fc2 = (p) =>
            {
                return "傳入參數" + p + ",地球是圓的";
            };

            string result = Test<int>(fc1, 1);//調用委託
            string result2 = Test<string>(fc2, "1");//調用委託

            Console.WriteLine(result);
            Console.WriteLine(result2);
            Console.ReadKey();
        }

        static string Test<T>(Func<T, string> fc, T inputParam)
        {
            return fc(inputParam);
        }

 

總結:lambda

Delegate至少0個參數,至多32個參數,能夠無返回值,也能夠指定返回值類型

Func能夠接受0個至16個傳入參數,必須具備返回值

Action能夠接受0個至16個傳入參數,無返回值

相關文章
相關標籤/搜索