溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#委托怎么使用

發(fā)布時(shí)間:2022-02-24 16:47:42 來源:億速云 閱讀:146 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了C#委托怎么使用的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇C#委托怎么使用文章都會(huì)有所收獲,下面我們一起來看看吧。

    1、什么是委托

    從數(shù)據(jù)結(jié)構(gòu)來講,委托是和類一樣是一種用戶自定義類型。

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

    2、委托的定義

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

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

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

    3、委托的實(shí)例化

    3.1 使用new關(guān)鍵字

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

    3.2 使用匿名方法

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

    3.3 使用Lambda表達(dá)式

    class Program
        {
            //聲明委托
            delegate int MyDelegate(int x, int y);
    
            static void Main(string[] args)
            {
                //實(shí)例化委托
                //1、使用new關(guān)鍵字
                MyDelegate _myDelegate = new MyDelegate(GetSum);
    
                //2、使用匿名方法
                MyDelegate myDelegate = delegate(int x, int y)
                {
                    return x + y;
                };
    
                //3、使用Lambda表達(dá)式
                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);//定義有兩個(gè)泛型(T1,T2)的委托,T2作為委托函數(shù)返回類型,T1作為委托函數(shù)參數(shù)類型

    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>實(shí)例化為<int,bool>,即表示有一個(gè)int類型參數(shù)且返回類型是bool的函數(shù).
          Console.WriteLine(_delegate(9));//false
    }

    5、C#內(nèi)置泛型委托

    C#共有3種內(nèi)置泛型委托

    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:此委托返回一個(gè)bool值,該委托通常引用一個(gè)"判斷條件函數(shù)"。
                //需要指出的是,判斷條件一般為“外部的硬性條件”,比如“大于50”,而不是由數(shù)據(jù)自身指定,如“查找數(shù)組中最大的元素就不適合”。
                Predicate<int> _predicate = new Predicate<int>(Check);
                //使用Lambda表達(dá)式
                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、多播委托

    實(shí)例化委托時(shí)必須將一個(gè)匹配函數(shù)注冊(cè)到委托上來實(shí)例化一個(gè)委托對(duì)象,但是一個(gè)實(shí)例化委托不僅可以注冊(cè)一個(gè)函數(shù)還可以注冊(cè)多個(gè)函數(shù),注冊(cè)多個(gè)函數(shù)后,在執(zhí)行委托的時(shí)候會(huì)根據(jù)注冊(cè)函數(shù)的注冊(cè)先后順序依次執(zhí)行每一個(gè)注冊(cè)函數(shù)。

    函數(shù)注冊(cè)委托的原型:

    <委托類型> <實(shí)例化名>+=new <委托類型>(<注冊(cè)函數(shù)>)

    例如:MyDelegate _myDelegate+=new MyDelegate(CheckMod);//將函數(shù)CheckMod注冊(cè)到委托實(shí)例_checkDelegate上

    在.net 2.0開始可以直接將匹配的函數(shù)注冊(cè)到實(shí)例化委托:

    <委托類型> <實(shí)例化名>+=<注冊(cè)函數(shù)>

    例如:MyDelegate _myDelegate+=CheckMod;//將函數(shù)CheckMod注冊(cè)到委托實(shí)例_myDelegate上

    注意:委托必須先實(shí)例化以后,才能使用+=注冊(cè)其他方法。如果對(duì)注冊(cè)了函數(shù)的委托實(shí)例從新使用=號(hào)賦值,相當(dāng)于是重新實(shí)例化了委托,之前在上面注冊(cè)的函數(shù)和委托實(shí)例之間也不再產(chǎn)生任何關(guān)系。

    有+=注冊(cè)函數(shù)到委托,也有-=解除注冊(cè)

    例如:MyDelegate _myDelegate-=CheckMod;

    如果在委托注冊(cè)了多個(gè)函數(shù)后,如果委托有返回值,那么調(diào)用委托時(shí),返回的將是最后一個(gè)注冊(cè)函數(shù)的返回值。

    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,返回最后一個(gè)注冊(cè)函數(shù)的返回值
            }
    
            static int fun1(int x, int y)
            {
                return x + y;
            }
    
            static int fun2(int x, int y)
            {
                return x;
            }
        }
    }

    關(guān)于“C#委托怎么使用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“C#委托怎么使用”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI