欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#委托用法詳解

 更新時(shí)間:2022年02月24日 11:33:14   作者:.NET開(kāi)發(fā)菜鳥(niǎo)  
本文詳細(xì)講解了C#中委托的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1、什么是委托

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

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

2、委托的定義

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

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

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

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

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

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

3.2 使用匿名方法

<委托類(lèi)型> <實(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ù)返回類(lèi)型,T1作為委托函數(shù)參數(shù)類(lèi)型

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類(lèi)型參數(shù)且返回類(lèi)型是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>只能委托必須是無(wú)返回值的方法
            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è)到委托上來(lái)實(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è)委托的原型:

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

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

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

<委托類(lèi)型> <實(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#委托用法的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • WPF中下拉框可作選擇項(xiàng)也可以作為只讀文本框使用的方法

    WPF中下拉框可作選擇項(xiàng)也可以作為只讀文本框使用的方法

    這篇文章主要給大家介紹了關(guān)于WPF中下拉框可以選擇項(xiàng)也可以作為只讀文本框使用的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-02-02
  • C#沉淀之委托的深入講解

    C#沉淀之委托的深入講解

    如果要給方法傳遞一個(gè)方法參數(shù)時(shí),就可以使用委托。下面這篇文章主要給大家介紹了關(guān)于C#沉淀之委托的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-09-09
  • 如何使用C#修改本地Windows系統(tǒng)時(shí)間

    如何使用C#修改本地Windows系統(tǒng)時(shí)間

    這篇文章主要介紹了如何使用C#修改本地Windows系統(tǒng)時(shí)間,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-01-01
  • C#反射在實(shí)際應(yīng)用中的實(shí)例代碼

    C#反射在實(shí)際應(yīng)用中的實(shí)例代碼

    C#反射在實(shí)際應(yīng)用中的實(shí)例代碼,需要的朋友可以參考一下
    2013-03-03
  • WPF自定義實(shí)現(xiàn)IP地址輸入控件

    WPF自定義實(shí)現(xiàn)IP地址輸入控件

    這篇文章主要給大家介紹了關(guān)于WPF自定義實(shí)現(xiàn)IP地址輸入控件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用WPF具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • C#中的序列化與反序列化方式

    C#中的序列化與反序列化方式

    本文介紹了C#中的序列化和反序列化概念、目的及其在不同場(chǎng)景中的應(yīng)用,文章詳細(xì)講解了二進(jìn)制序列化、XML序列化和JSON序列化的方法和特點(diǎn),并提供了一些示例代碼
    2024-12-12
  • c#數(shù)據(jù)類(lèi)型基礎(chǔ)

    c#數(shù)據(jù)類(lèi)型基礎(chǔ)

    C#里面的數(shù)據(jù)類(lèi)型分為兩種:值類(lèi)型和引用類(lèi)型。
    2008-08-08
  • C#使用HtmlAgilityPack抓取糗事百科內(nèi)容實(shí)例

    C#使用HtmlAgilityPack抓取糗事百科內(nèi)容實(shí)例

    這篇文章主要介紹了C#使用HtmlAgilityPack抓取糗事百科內(nèi)容的方法,實(shí)例分析了C#中HtmlAgilityPack的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • C#調(diào)用WinAPI部分命令的方法實(shí)現(xiàn)

    C#調(diào)用WinAPI部分命令的方法實(shí)現(xiàn)

    本文主要介紹了C#調(diào)用WinAPI部分命令的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • C#給PDF文件添加水印

    C#給PDF文件添加水印

    這篇文章主要為大家詳細(xì)介紹了C#給PDF文件添加水印的相關(guān)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03

最新評(píng)論