C#委託的幾種表現方式

兵工廠三劍客發表於2018-07-13

以Func為例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace mytest.del
{
    class Program
    {

        static Func<int, int, int> plusDel;
        static void Main(string[] args)
        {
            plusDel = delegate(int a, int b)
            {
                return a + b;
            };
            int sum1 = plusDel(1, 1);

            plusDel = (a, b) =>
            {
                return a + b;
            };
            int sum2 = plusDel(1, 1);

            plusDel = new Func<int, int, int>((a, b) =>
            {
                return a + b;
            });
            int sum3 = plusDel(1, 1);

            plusDel = new Func<int, int, int>(GetResult);
            int sum4 = plusDel(1, 1);

            Console.WriteLine(string.Format("sum1={0},sum2={1},sum3={2},sum4={3}", sum1, sum2, sum3, sum4));
            Console.ReadKey();

        }

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

這裡的sum1,sum2,sum3,sum4都是為2的。

現在我們自己定義一個委託:

class Program
    {

        delegate int PlusDel(int a, int b);
        static void Main(string[] args)
        {
            PlusDel del1= GetResult;
            PlusDel del2 = new PlusDel(GetResult);
            PlusDel del3 = (a, b) => { return a + b; };
            int sum1 = del1(1, 1);
            int sum2 = del2(1, 1);
            int sum3 = del3(1, 1);
        }

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

這裡的sum1,sum2,sum3的計算結果也會是一樣的。

對於引數宣告成delegate的類,可以如下進行操作:

Thread thread1 = new Thread(() => { });
            Thread thread2 = new Thread(new ThreadStart(() => { }));
            Thread thread3 = new Thread(new ThreadStart(delegate { }));
            Thread thread4 = new Thread(new ThreadStart(Method));
private void Method()
        { 
        
        }

這4個執行緒的效果可以一樣。因為ThreadStart是delegate宣告的。

但是對於Delegate宣告的引數,如下程式碼:

this.BeginInvoke(new Action<int, int>((a, b) =>
            {

            }), new object[] { 1, 1 });

必須使用new關鍵字進行例項化委託物件。BeginInvoke的原型是如下的:

public IAsyncResult BeginInvoke(Delegate method, params object[] args);

錯誤或者不足的地方,歡迎大家指正。


相關文章