亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#委托與事件初探

2020-01-24 01:16:46
字體:
來源:轉載
供稿:網友

委托給了C#操作函數的靈活性,我們可使用委托像操作變量一樣來操作函數,其實這個功能并不是C#的首創,早在C++時代就有函數指針這一說法,而在我看來委托就是C#的函數指針,首先先簡要的介紹一下委托的基本知識:

委托的定義

委托的聲明原型是

delegate <函數返回類型> <委托名> (<函數參數>)

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

這樣就定義了一個委托,但是委托在.net內相當于聲明了一個類(在后面的代碼中會講到確實如此),類如果不實例化為對象,很多功能是沒有辦法使用的,委托也是如此.

委托的實例化

委托實例化的原型是

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

例子:CheckDelegate _checkDelegate=new CheckDelegate(CheckMod);//用函數CheckMod實例化上面的CheckDelegate 委托為_checkDelegate

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

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

例子:CheckDelegate _checkDelegate=CheckMod;//用函數CheckMod實例化上面的CheckDelegate 委托為_checkDelegate
現在我們就可以像使用函數一樣來使用委托了,在上面的例子中現在執行_checkDelegate()就等同于執行CheckMod(),最關鍵的是現在函數CheckMod相當于放在了變量當中,它可以傳遞給其它的CheckDelegate引用對象,而且可以作為函數參數傳遞到其他函數內,也可以作為函數的返回類型

事件是委托的一種特殊形式,當發生有意義的事情時,事件處理對象通知過程。

一.C語言中的函數指針

  想要理解什么是委托,就要先理解函數指針的概念。所謂函數指針,就是指向函數的指針(等于沒說-.-)。比如我定義了兩個函數square和cube分別用于計算一個數的平方和立方,我再定義函數指針calcu,然后我讓calcu指向square,那么調用calcu時就相當于調用了square函數(注意,此處函數指針接受的參數類型及個數要與函數一致)。很好理解吧?不多說,上代碼。

#include <stdio.h>void square(int x) { printf("square of %d is %d/n",x,x*x); }void cube(int x) { printf("cube of %d is %d/n",x,x*x*x); }int main(){void (*calcu)(int x);calcu=square;calcu();return ;}

二.C#中委托的實質

  委托又名委托類型,為什么C#弄出這個東西?因為C#是一門比較安全的語言,不允許操作指針,于是我們不能定義函數指針。但想要達到相同的效果,于是定義了委托類型。所謂委托類型,其本質就是C中的指針類型。于是代碼變成了這樣:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Delegate{class Program{static void square(int x) { Console.WriteLine("square of {} is {}", x, x * x); }static void cube(int x) { Console.WriteLine("cube of {} is {}", x, x * x * x); }delegate void math(int x); //定義委托類型static void Main(string[] args){math calcu;calcu += square;calcu();Console.ReadKey();}}} 

  可以看出,定義委托類型math實際上就相當于定義了void*類型。而委托類型實例化得到的calcu實際上就是函數指針。(說句題外話:定義函數(方法)時要加上static是因為調用函數時并未實例化,只有靜態方法能夠直接通過類調用)。

三.委托的使用方法

  我們在上述代碼19行后面加上一行代碼 calcu+=cube; 運行會發現,square和cube均被調用。可以看出,符號 += 表示綁定方法到委托變量,同理符號 -= 表示取消綁定。可以理解為calcu是void **類型,即它指向了一個數組,數組中的每一項都是函數指針類型,每次調用calcu時,遍歷此數組,即依次調用每個綁定的方法。

四.封裝與事件的引入

  下面我們要用面向對象的思想將上述代碼進行封裝,使其變清晰。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Delegate{public delegate void math(int x);public class Calcu{public math calcu;}class Program{static void square(int x) { Console.WriteLine("square of {} is {}", x, x * x); }static void cube(int x) { Console.WriteLine("cube of {} is {}", x, x * x * x); }static void Main(string[] args){Calcu c = new Calcu();c.calcu += square;c.calcu += cube;c.calcu();Console.ReadKey();}}}

由于委托變量是public的,封裝的程度很低,在外部可以任意修改。為了改進這個問題,C#引入了事件。

  所謂事件,實際上還是委托的實例化,只是其內部多了一些定義,多了一些限制。其一,事件實際上聲明了一個private類型的委托變量,因此在類外無法直接調用。

  于是我們將上述代碼的第12行改成這樣:

public event math calcu;

  運行之后25行報錯了,因為calcu是private的,不能直接調用。但23,24行并沒有報錯。那么問題來了,為什么我們可以用+=來給calcu綁定方法呢?

  因為其二,事件還幫我們干了一件事情,就是定義了綁定方法和取消綁定方法的函數,它們是public的,并且將運算符+=,-=重載,和這兩個函數對應。

  好了,現在我們要寫一個接口函數來完成計算:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Delegate{public delegate void math(int x);public class Calcu{public event math calcu;public void calculate(int x){calcu(x);}}class Program{static void square(int x) { Console.WriteLine("square of {} is {}", x, x * x); }static void cube(int x) { Console.WriteLine("cube of {} is {}", x, x * x * x); }static void Main(string[] args){Calcu c = new Calcu();c.calcu += square;c.calcu += cube;c.calculate();Console.ReadKey();}}}

  至此,基本概念已經清晰。

  想來,使用事件會讓人不得不將對象封裝起來,這應該就是面向對象思想的體現吧。

以上內容是針對C#委托與事件初探的相關知識,希望對大家有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲aa在线观看| 欲色天天网综合久久| 日韩精品视频在线观看网址| 中文字幕精品—区二区| 91九色单男在线观看| 欧美日韩免费在线| 最新亚洲国产精品| 美女视频黄免费的亚洲男人天堂| 国内成人精品一区| 91美女福利视频高清| 欧美精品成人91久久久久久久| 91久久久在线| 国产精品久久久久久久久久尿| 久久久久久18| 午夜美女久久久久爽久久| 成人国产亚洲精品a区天堂华泰| 中文字幕精品久久久久| 欧美性生活大片免费观看网址| 国产v综合ⅴ日韩v欧美大片| 日韩成人网免费视频| 中文字幕日韩在线观看| 亚洲老头老太hd| 欧美日韩亚洲天堂| 97在线视频国产| 国产日韩在线看| 91爱视频在线| 日韩精品亚洲视频| 亚洲性视频网址| 亚洲影视中文字幕| 国产精品你懂得| 97免费中文视频在线观看| 国产精品自产拍在线观| 欧美亚洲另类激情另类| 欧美成人免费一级人片100| 日韩中文娱乐网| 成人精品网站在线观看| 国产精品www色诱视频| 俺也去精品视频在线观看| 欧美一级在线亚洲天堂| 亚洲www在线| 久久久久国色av免费观看性色| 欧美精品videosex牲欧美| 欧美一级大片在线观看| 欧美另类极品videosbest最新版本| 成人97在线观看视频| 日韩av在线播放资源| 午夜精品福利在线观看| 日韩精品久久久久| 国产欧美 在线欧美| 亚洲区一区二区| 亚洲精品一区在线观看香蕉| 亚洲性日韩精品一区二区| 一本色道久久综合狠狠躁篇的优点| 欧美精品久久久久久久久| 欧美亚洲视频在线看网址| 欧美日韩国产黄| 久久在线免费观看视频| 欧美成人免费一级人片100| 中文字幕九色91在线| 91中文精品字幕在线视频| 亚洲qvod图片区电影| 亚洲天堂影视av| 欧美性少妇18aaaa视频| 国产精品久久久久久久app| 国产有码一区二区| 97在线看免费观看视频在线观看| 亚洲欧美成人网| 自拍视频国产精品| 国产成人精品综合| 欧美午夜精品久久久久久浪潮| 日韩av电影在线网| 亚洲人成电影网站色xx| 亚洲精品一区二区三区不| 91天堂在线观看| 久久91精品国产91久久久| 亚洲欧美日韩国产精品| 欧美在线影院在线视频| 精品国产91久久久久久老师| 国产日韩欧美91| 日本久久久a级免费| 8x海外华人永久免费日韩内陆视频| 精品久久久久久久久久ntr影视| 成人黄色av免费在线观看| 欧美精品在线免费观看| 26uuu国产精品视频| 在线观看日韩视频| 毛片精品免费在线观看| 最近中文字幕日韩精品| 国产精品视频免费在线| 欧美xxxx18性欧美| 亚洲精品国产成人| 亚洲成人网av| 久久视频免费观看| 久久久久亚洲精品成人网小说| 亚洲色图第三页| 欧美大学生性色视频| 欧美综合国产精品久久丁香| 高潮白浆女日韩av免费看| 国产性猛交xxxx免费看久久| 国产精品视频成人| 在线观看日韩av| 久久久久久久久久久免费| 亚洲精品丝袜日韩| 欧美激情一区二区三区高清视频| 在线看欧美日韩| 81精品国产乱码久久久久久| 亚洲国产一区二区三区四区| 国产视频久久网| 亚洲天堂影视av| 91精品国产91久久久久久最新| 美日韩精品免费观看视频| 久久视频在线免费观看| 91夜夜揉人人捏人人添红杏| 日韩电影中文字幕在线| 国产精品777| 亚洲免费成人av电影| 亚洲高清一区二| 亚洲成人xxx| 激情懂色av一区av二区av| 伦理中文字幕亚洲| 日韩电影中文字幕在线| 色悠久久久久综合先锋影音下载| 国产美女被下药99| 久久久久久久av| 热99精品只有里视频精品| 亚洲第一福利视频| 国产v综合v亚洲欧美久久| 色综合伊人色综合网| 欧美国产亚洲精品久久久8v| 亚洲国产成人在线播放| 亚洲成人精品av| 中文字幕亚洲欧美日韩高清| 91中文在线视频| 中文字幕亚洲一区在线观看| 美日韩精品免费视频| 久久视频国产精品免费视频在线| 亚洲精品成人免费| 国产精品久久久久久久av大片| 亚洲一区美女视频在线观看免费| 国产精品视频xxxx| 国产精品视频专区| 日韩在线不卡视频| 久久亚洲国产精品成人av秋霞| 欧美xxxwww| 国产精品大片wwwwww| 中文字幕亚洲第一| 国产精品白嫩美女在线观看| 中文字幕国产亚洲2019| 亚洲人成在线观看网站高清| 国产亚洲日本欧美韩国| 欧美视频一二三| 欧美黄色成人网| 成人av在线天堂| 亚洲成色777777女色窝| 日韩精品黄色网| 欧美一区三区三区高中清蜜桃| 人人做人人澡人人爽欧美| 国产精品三级美女白浆呻吟| 91久久国产精品91久久性色| 日本久久91av| 国产精品一区二区三区成人| 日韩成人中文字幕| 一本色道久久88综合日韩精品| 国产精品久久久久久久久久ktv|