国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

理解C#委托(Delegate)通俗易懂,深入淺出

這篇具有很好參考價值的文章主要介紹了理解C#委托(Delegate)通俗易懂,深入淺出。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

委托是什么?

委托首先是一個數(shù)據(jù)類型,我們可以像定義結(jié)構(gòu)體一樣定義一個委托類型,委托(Delegate) 是存有對某個方法的引用的一種引用類型變量。引用可在運行時被改變

委托的定義

//語法
delegate <return type> <delegate-name> <parameter list>
//實例
public delegate int MyDelegate (string s);

實例化委托(Delegate)

例如:

public delegate void printString(string s);
...
printString ps1 = new printString(WriteToScreen);
printString ps2 = new printString(WriteToFile);

說白了就是類似指向函數(shù)方法的指針,我們可以類似定義指針類型一樣,定義委托的類型

在定義委托類型時要指定函數(shù)的參數(shù)類型和返回值,一旦聲明了委托類型,委托對象必須使用 new 關(guān)鍵字來創(chuàng)建,且與一個特定的方法有關(guān)。當(dāng)創(chuàng)建委托時,傳遞到 new 語句的參數(shù)就像方法調(diào)用一樣書寫,但是不帶有參數(shù)。

簡單用法實例

using System;

delegate int NumberChanger(int n);
namespace DelegateAppl
{
   class TestDelegate
   {
      static int num = 10;
      public static int AddNum(int p)
      {
         num += p;
         return num;
      }

      public static int MultNum(int q)
      {
         num *= q;
         return num;
      }
      public static int getNum()
      {
         return num;
      }

      static void Main(string[] args)
      {
         // 創(chuàng)建委托實例
         NumberChanger nc1 = new NumberChanger(AddNum);
         NumberChanger nc2 = new NumberChanger(MultNum);
         // 使用委托對象調(diào)用方法
         nc1(25);
         Console.WriteLine("Value of Num: {0}", getNum());
         nc2(5);
         Console.WriteLine("Value of Num: {0}", getNum());
         Console.ReadKey();
      }
   }
}

這只是簡單的用法介紹,可以看出 這和在主程序里直接調(diào)用方法沒啥區(qū)別,并不是實際的用法。

委托的用途

多播

委托對象可使用 “+” 運算符進行合并。一個合并委托調(diào)用它所合并的兩個委托。只有相同類型的委托可被合并。"-" 運算符可用于從合并的委托中移除組件委托。

使用委托的這個有用的特點,您可以創(chuàng)建一個委托被調(diào)用時要調(diào)用的方法的調(diào)用列表。這被稱為委托的 多播(multicasting),也叫組播。下面的程序演示了委托的多播

static void Main(string[] args)
      {
         // 創(chuàng)建委托實例
         NumberChanger nc;
         NumberChanger nc1 = new NumberChanger(AddNum);
         NumberChanger nc2 = new NumberChanger(MultNum);
         nc = nc1;
         nc += nc2;
         // 調(diào)用多播
         nc(5);
         Console.WriteLine("Value of Num: {0}", getNum());
         Console.ReadKey();
      }
   }
}

關(guān)鍵: 委托的使用場景

委托,故名思意,咱們用一個形象的比喻,公司里 ,老板/調(diào)用者 ,可以不用委托我/激活委托函數(shù),親自去給張三/func1,李四/func2 安排工作,就是直接調(diào)用,這時或許要準備調(diào)用的參數(shù)和調(diào)用方式的代碼 比如循環(huán)調(diào)用,
老板/調(diào)用者 還可以通過我/激活委托的函數(shù) 去安排張三李四的工作,同時也可以指定張三/func1,李四/func2 一起工作/±多播,也可以拓展新的員工/方法。
和類的繼承多態(tài)有異曲同工之妙,不過更加靈活,我/激活委托函數(shù) 不需要知道自己要調(diào)用什么函數(shù)以及具體實現(xiàn),只管用調(diào)用者給的參數(shù)就行了 ,父類不用管子類如何實現(xiàn)的,通過子類型的賦值,就能調(diào)用子類重寫的方法。


        //委托

        // 委托聲明
        public delegate void doSomething(string s);
		//定義 回調(diào)函數(shù)  ,公司里的員工 張三,李四.............
		public static void ZangSan(string a) {
			Console.WriteLine("zhangsan"+a);
		}
        public static void LiSi(string a)
        {
            Console.WriteLine("lisi"+a);
        }
        /// <summary>
        /// 中介,委托處理 ,使用此方法觸發(fā)委托回調(diào)
        /// </summary>
        /// <param name="from">開始</param>
        /// <param name="to">結(jié)束</param>
        /// <param name="fb">委托引用</param>      
            private static void handleDelegate(int from, int to, doSomething ds)
            {
			//一些預(yù)處理 ,這樣使用委托就比直接調(diào)用方便了
                for (int val = from; val <= to; val++)
                {
                 
                    if (ds != null)
                    {
                        ds(val.ToString());
                    }
                    //ds?.Invoke(val); 簡化版本調(diào)用
                }
            }
        

        //主函數(shù),調(diào)用者 老板
        public void testDelegate()
        {     //老板通過我/中介 給張三安排工作,
			doSomething dsZhangSan = new doSomething(ZangSan);
			//給張三李四 按順序安排工作  //按序執(zhí)行
			doSomething dsLisi = new doSomething(LiSi);
			doSomething ds = dsZhangSan + dsLisi;
			//在調(diào)用的時可以給張三,李四傳參數(shù),這里在handleDelegate里面給了 ds(val.ToString());
			handleDelegate(0, 3, ds);

			//方法的返回值,參數(shù)必須完全一樣,符合委托類型的定義
		}

執(zhí)行結(jié)構(gòu)

理解C#委托(Delegate)通俗易懂,深入淺出

回調(diào)函數(shù)的機制

把我想象成是獨立的提供服務(wù)的中介,而老板/函數(shù)實現(xiàn)的一方, 張三/func1,李四/func2 ~~~是一個公司的,合作時,老板指定張三或是李四… , 而我不需要關(guān)心,我只是在特點條件發(fā)生時去調(diào)用張三李四就行了文章來源地址http://www.zghlxwxcb.cn/news/detail-432912.html

⑴定義一個回調(diào)函數(shù);
⑵提供函數(shù)實現(xiàn)的一方在初始化的時候,將回調(diào)函數(shù)的函數(shù)指針注冊給調(diào)用者;
⑶當(dāng)特定的事件或條件發(fā)生的時候,調(diào)用者使用函數(shù)指針調(diào)用回調(diào)函數(shù)對事件進行處理。

到了這里,關(guān)于理解C#委托(Delegate)通俗易懂,深入淺出的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 建造者模式深入理解:演示建造單個和多個產(chǎn)品的實踐,結(jié)合模板模式,通俗易懂

    建造者模式深入理解:演示建造單個和多個產(chǎn)品的實踐,結(jié)合模板模式,通俗易懂

    首先呢看下建造者的定義是什么樣的,先讀一遍 建造者模式 (Builder Pattern)是一種創(chuàng)建型設(shè)計模式,它主要用于將一個復(fù)雜對象的構(gòu)建過程與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表現(xiàn)形式。這種模式通過一系列可重用的獨立的類(稱為建造者或構(gòu)建器)來一

    2024年01月22日
    瀏覽(28)
  • C#中的委托(Delegate)和事件 (Event)詳解與使用范例

    最近天氣晴雨不定,你因為害怕打游戲時忘記在下雨時收衣服或者在天晴時把衣服掛出去,于是你委托好友小明在天氣發(fā)生變化時打電話通知你,這就是一種委托. 下面是這種委托的實例代碼 以上代碼的輸出為 值得一提的是,如下代碼為創(chuàng)建一個繼承自Delegate類的名為XiaoMing的子類

    2023年04月12日
    瀏覽(23)
  • 面試??迹篊# 委托(delegate、Action、Func、predicate)和事件

    剛開始工作的時候,覺得委托和事件有些神秘,而當(dāng)你理解他們之后,也覺得好像沒有想象中的那么難,這篇博文算是自己對委托和事件的一次梳理和總結(jié)。 C#中的委托,相當(dāng)于C++中的指針函數(shù),但委托是面向?qū)ο蟮模前踩?,是一個特殊的類,當(dāng)然他也是引用類型,委托

    2024年02月16日
    瀏覽(23)
  • MVCC詳解,深入淺出簡單易懂

    MVCC詳解,深入淺出簡單易懂

    一、什么是MVCC? mvcc,也就是多版本并發(fā)控制,是為了在讀取數(shù)據(jù)時不加鎖來提高讀取效率和并發(fā)性的一種手段。 數(shù)據(jù)庫并發(fā)有以下幾種場景: 讀-讀:不存在任何問題。 讀-寫:有線程安全問題,可能出現(xiàn)臟讀、幻讀、不可重復(fù)讀。 寫-寫:有線程安全問題,可能存在更新丟

    2024年02月04日
    瀏覽(22)
  • 通俗易懂,Spring Bean生命周期管理的理解

    目錄 1、實例化階段 2、初始化階段 3、銷毀階段 總結(jié) 在Spring框架中, Bean是最基本的組件,它是Spring框架中的一個Java對象 。 下面通過@Bean來理解bean的生命周期: 在Spring框架中,@Bean注解用于告訴Spring框架一個方法將會返回一個對象,這個對象要注冊為Spring應(yīng)用上下文中的

    2024年02月21日
    瀏覽(31)
  • 通俗易懂,unity和c#是什么關(guān)系

    通俗易懂,unity和c#是什么關(guān)系

    Unity 是實時3D互動內(nèi)容創(chuàng)作和運營平臺。包括游戲開發(fā)、美術(shù)、建筑、汽車設(shè)計、影視在內(nèi)的所有創(chuàng)作者,借助Unity將創(chuàng)意變成現(xiàn)實。 Unity平臺提供一整套完善的軟件解決方案 ,可用于創(chuàng)作、運營和變現(xiàn)任何實時互動的2D和3D內(nèi)容,支持平臺包括手機、平板電腦、PC、游戲主機

    2024年02月04日
    瀏覽(18)
  • 通俗易懂 快速理解 JDK動態(tài)代理 和 cglib動態(tài)代理

    通俗易懂 快速理解 JDK動態(tài)代理 和 cglib動態(tài)代理

    動態(tài)代理的實現(xiàn)方案有兩種, JDK動態(tài)代理 和 CGLIB動態(tài)代理 ,區(qū)別在于JDK自帶的動態(tài)代理,必須要有接口,而CGLIB動態(tài)代理有沒有接口都可以。 JDK動態(tài)代理 :JDK原生的實現(xiàn)方式,需要被代理的目標類必須實現(xiàn)接口。因為這個技術(shù)要求 代理對象和目標對象實現(xiàn)同樣的接口 (兄

    2024年02月08日
    瀏覽(23)
  • python類(class)的定義、使用、繼承、應(yīng)用的通俗易懂理解

    1.為什么使用類 ????????一個類(class)可以包囊眾多函數(shù),所以一般使用類的情況下,都需要用到眾多有共性的函數(shù),把這些可能會一起調(diào)用的函數(shù)或者需要接連調(diào)用的函數(shù)歸為一個類,這樣需要使用的時候可以輕易的找到。 ????????在處理不同細節(jié)時使用的類區(qū)別

    2024年02月22日
    瀏覽(30)
  • Kotlin委托Delegate托管by

    property=\\\'user\\\' setValue - fly property=\\\'user\\\' getValue fly 0 - 2023 2023 - 2024 Delegates.observable追蹤觀察可變數(shù)據(jù)更新,Kotlin_zhangphil的博客-CSDN博客 **Java觀察者模式的場景:一個女孩洗澡,被很多男孩偷看。女孩洞察后,搜索壞男孩,然后繼續(xù)洗澡。*//*男孩Boy.java*/import java.util.Observable;不定長

    2024年02月09日
    瀏覽(29)
  • Linux 權(quán)限-+完整思維導(dǎo)圖+實圖例子+深入細節(jié)+通俗易懂建議收藏

    Linux 權(quán)限-+完整思維導(dǎo)圖+實圖例子+深入細節(jié)+通俗易懂建議收藏

    ????????當(dāng)時間的主人,命運的主宰,靈魂的舵手。上一回已將基礎(chǔ)權(quán)限全部學(xué)習(xí)完了,本章開始我們將進入到權(quán)限的學(xué)習(xí)。 話不多說安全帶系好,發(fā)車啦 (建議電腦觀看) 。 附:紅色,部分為重點部分;藍顏色為需要記憶的部分(不是死記硬背哈,多敲);黑色加粗

    2024年02月06日
    瀏覽(46)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包