C#委托用法詳解

1、什麼是委托

從數據結構來講,委托是和類一樣是一種用戶自定義類型。

委托是方法的抽象,它存儲的就是一系列具有相同簽名和返回回類型的方法的地址。調用委托的時候,委托包含的所有方法將被執行。

2、委托的定義

委托是類型,就好像類是類型一樣。與類一樣,委托類型必須在被用來創建變量以及類型對象之前聲明。

委托的聲明原型是
delegate <函數返回類型> <委托名> (<函數參數>)

例子:public delegate void MyDelegate(int number);//定義瞭一個委托MyDelegate,它可以註冊返回void類型且有一個int作為參數的函數

3、委托的實例化

3.1 使用new關鍵字

委托實例化的原型是
<委托類型> <實例化名>=new <委托類型>(<註冊函數>)
例子:MyDelegate _MyDelegate=new MyDelegate(CheckMod);//用函數CheckMod實例化上面的MyDelegate 委托為_MyDelegate

3.2 使用匿名方法

<委托類型> <實例化名>=delegate(<函數參數>){函數體};

3.3 使用Lambda表達式

class Program
    {
        //聲明委托
        delegate int MyDelegate(int x, int y);

        static void Main(string[] args)
        {
            //實例化委托
            //1、使用new關鍵字
            MyDelegate _myDelegate = new MyDelegate(GetSum);

            //2、使用匿名方法
            MyDelegate myDelegate = delegate(int x, int y)
            {
                return x + y;
            };

            //3、使用Lambda表達式
            MyDelegate myDelegateLambda = (int x, int y) => { return x + y; };
        }

        static int GetSum(int x, int y)
        {
            return x + y;
        }
    }

4、泛型委托

委托也支持泛型的使用

泛型委托原型:

delegate <T1> <委托名><T1,T2,T3…> (T1 t1,T2 t2,T3 t3…)

例如:delegate T2 DelegateDemo<T1,T2>(T1 t);//定義有兩個泛型(T1,T2)的委托,T2作為委托函數返回類型,T1作為委托函數參數類型

static boo Check(int i)
{
     if(i%2==0)

     {

          return true; 

    }

     return false;
}

static void Main(string[] args)
{
      DelegateDemo<int, bool> _delegate =Check;//將泛型委托委托<T1,T2>實例化為<int,bool>,即表示有一個int類型參數且返回類型是bool的函數.
      Console.WriteLine(_delegate(9));//false
}

5、C#內置泛型委托

C#共有3種內置泛型委托

namespace DelegateDemo
{
    class Program
    {
        //聲明委托
        delegate int MyDelegate(int x, int y);

        static void Main(string[] args)
        {
            //1、Action<T>隻能委托必須是無返回值的方法
            Action<string> _action = new Action<string>(SayHello);
            _action("Hello World");

            //2、Fun<TResult>隻是委托必須有返回值的方法
            Func<int, bool> _func = new Func<int, bool>(Check);
            _func(5);

            //3、Predicate:此委托返回一個bool值,該委托通常引用一個"判斷條件函數"。
            //需要指出的是,判斷條件一般為“外部的硬性條件”,比如“大於50”,而不是由數據自身指定,如“查找數組中最大的元素就不適合”。
            Predicate<int> _predicate = new Predicate<int>(Check);
            //使用Lambda表達式
            Predicate<int> predicate = p => p % 2 == 0;
            _predicate(26);
        }

        static void SayHello(string strMsg)
        {
            Console.WriteLine(strMsg);
        }

        //返回值為bool值
        static bool Check(int i)
        {
            if (i % 2 == 0)
            {
                return true;
            }
            return false;
        }
    }
}

6、多播委托

實例化委托時必須將一個匹配函數註冊到委托上來實例化一個委托對象,但是一個實例化委托不僅可以註冊一個函數還可以註冊多個函數,註冊多個函數後,在執行委托的時候會根據註冊函數的註冊先後順序依次執行每一個註冊函數。

函數註冊委托的原型:

<委托類型> <實例化名>+=new <委托類型>(<註冊函數>)

例如:MyDelegate _myDelegate+=new MyDelegate(CheckMod);//將函數CheckMod註冊到委托實例_checkDelegate上

在.net 2.0開始可以直接將匹配的函數註冊到實例化委托:

<委托類型> <實例化名>+=<註冊函數>

例如:MyDelegate _myDelegate+=CheckMod;//將函數CheckMod註冊到委托實例_myDelegate上

註意:委托必須先實例化以後,才能使用+=註冊其他方法。如果對註冊瞭函數的委托實例從新使用=號賦值,相當於是重新實例化瞭委托,之前在上面註冊的函數和委托實例之間也不再產生任何關系。

有+=註冊函數到委托,也有-=解除註冊

例如:MyDelegate _myDelegate-=CheckMod;

如果在委托註冊瞭多個函數後,如果委托有返回值,那麼調用委托時,返回的將是最後一個註冊函數的返回值。

namespace DelegateDemo
{
    class Program
    {
        //聲明委托
        delegate int MyDelegate(int x, int y);

        static void Main(string[] args)
        {
            MyDelegate _myDelegate = new MyDelegate(fun1);
            _myDelegate += fun2;
            Console.WriteLine(_myDelegate(10,23));

            Console.ReadKey();//輸出10,返回最後一個註冊函數的返回值
        }

        static int fun1(int x, int y)
        {
            return x + y;
        }

        static int fun2(int x, int y)
        {
            return x;
        }
    }
}

到此這篇關於C#委托用法的文章就介紹到這瞭。希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: