成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

進(jìn)一步接觸C#委托與事件

開(kāi)發(fā) 后端
本文通過(guò)在控制臺(tái)下使用C#委托和事件和在窗體中使用C#委托和事件這兩部分內(nèi)容進(jìn)一步地揭示了C#委托與事件的相關(guān)問(wèn)題,供大家參考。

一、在控制臺(tái)下使用C#委托和事件

我們都知道,C#中有“接口”這個(gè)概念,所謂的“接口”就是定義一套標(biāo)準(zhǔn),然后由實(shí)現(xiàn)類(lèi)來(lái)具體實(shí)現(xiàn)其中的方法,所以說(shuō)“接口,是一組類(lèi)的抽象”。同樣道理,我們可以將“委托”理解為“方法的抽象”,也就是說(shuō)定義一個(gè)方法的模板,至于這個(gè)方法具體是怎么樣的,就由方法自己去實(shí)現(xiàn)。

我們知道接口的***好處就是可以實(shí)現(xiàn)多態(tài),同理,“委托”是可以實(shí)現(xiàn)方法的多態(tài),當(dāng)我們想調(diào)用某個(gè)具體方法的時(shí)候,我們不直接調(diào)用這個(gè)方法,而是去調(diào)用這個(gè)委托。當(dāng)然,我們必須在具體方法和委托之間建立某種關(guān)聯(lián)。

下面我們來(lái)看例子。

首先,我們定義一個(gè)委托:

  1. public delegate void SaySomething(string name); 

這跟抽象方法的語(yǔ)法格式很相似,只是多了一個(gè)關(guān)鍵字delegate。既然是對(duì)方法的一種抽象,那么我們最關(guān)注的當(dāng)然就是方法的返回值以及方法的參數(shù)了。所以上面紅色的部分就是我們定義出來(lái)的一個(gè)規(guī)矩,如果某個(gè)方法想委托我去做事,那么請(qǐng)你遵循我的規(guī)矩,就是返回值為void,參數(shù)為一個(gè)字符串。我們這個(gè)委托的含義是,當(dāng)某個(gè)人來(lái)了,就向他說(shuō)點(diǎn)東西。

好,既然我們已經(jīng)定義了這個(gè)規(guī)矩,下面我們就定義具體的方法了。

  1. public void SayHello(string name)  
  2. {  
  3.     Console.WriteLine("Hello," + name + "!");  
  4. }  
  5.  
  6.  
  7. public void SayNiceToMeetYou(string name)  
  8. {  
  9.     Console.WriteLine("Nice to meet you," + name + "!");  

我們這里一共定義了兩個(gè)方法,一個(gè)是向某人說(shuō)Hello,另一個(gè)是向某人說(shuō)Nice to meet you。我們看到,這里定義的兩個(gè)方法的返回值和參數(shù)跟我們前面定義的“委托”是一致的。

接下來(lái),我們來(lái)看事件。

  1. public event SaySomething come; 

我們定義了一個(gè)事件,這個(gè)事件是“有人來(lái)了”,注意定義的時(shí)候我們使用event關(guān)鍵字,除此之外,我們還加上了前面定義的“委托”的名字。這個(gè)意思是說(shuō),我這個(gè)事件只會(huì)跟“SaySomething”打交道,并且,當(dāng)我這個(gè)事件發(fā)生的時(shí)候,我會(huì)通知關(guān)注我的這些“委托”(再由這些“委托”去調(diào)用具體的方法)。

我們來(lái)定義一個(gè)測(cè)試方法:

  1. public void test() {   
  2.     SaySomething sayhello = new SaySomething(SayHello);  
  3.     SaySomething saynice = new SaySomething(SayNiceToMeetYou);  
  4.     come += sayhello;  
  5.     come += saynice;  
  6.     come("張三");  
  7. }  

方法體中的前面兩行是用來(lái)實(shí)例化委托,注意我們用到了new關(guān)鍵字,就好像實(shí)例化一個(gè)類(lèi)一樣,然后傳入一個(gè)參數(shù),但這個(gè)參數(shù)不是string類(lèi)型、也不是int類(lèi)型,而是一個(gè)方法名。

再下面兩行就是將委托加到事件上,意思是說(shuō),如果你這個(gè)事件發(fā)生了,就告訴我一聲。可以通過(guò)“+=”來(lái)將n個(gè)委托實(shí)例加到某個(gè)事件上,一旦這個(gè)事件發(fā)生,所有的這些委托實(shí)例都會(huì)得到通知。

***一行是觸發(fā)一個(gè)事件,注意我們是直接用一個(gè)事件名,然后跟一個(gè)參數(shù),這又跟“委托”中定義的那個(gè)規(guī)矩一致(即,要有一個(gè)string類(lèi)型的參數(shù))。

***運(yùn)行一下

  1. static void Main(string[] args)  
  2. {  
  3.     Program program = new Program();  
  4.     program.test();  
  5.     Console.Read();  
  6. }  

C#委托與事件 

我們回過(guò)頭來(lái)再看一下“事件”的定義:

  1. public event SaySomething come; 

這里已經(jīng)指出了“委托”的名字,所以,我們可以直接將方法加到事件上,而省略“委托”的實(shí)例化過(guò)程,因此上面的test()方法可以簡(jiǎn)單寫(xiě)為:

  1. public void test() {   
  2.     come += SayHello;  
  3.     come += SayNiceToMeetYou;  
  4.     come("張三");  
  5. }  

二、在窗體中使用C#委托和事件

上面的例子并不能體現(xiàn)委托和事件的優(yōu)點(diǎn),其實(shí),委托和事件在C#中使用非常廣泛,例如,當(dāng)我們點(diǎn)擊某個(gè)“按鈕”的時(shí)候,就會(huì)有一個(gè)“Click”事件觸發(fā),而這個(gè)事件會(huì)通知“委托”,在C#窗體應(yīng)用程序中,“委托”的名字比較規(guī)范,統(tǒng)一使用“EventHandler”,它的具體格式是“void EventHandler(object sender, EventArgs e);”。相信大家都寫(xiě)過(guò)下面這樣子的HelloWorld程序:

HelloWorld程序 

當(dāng)點(diǎn)擊按鈕的時(shí)候彈出一個(gè)對(duì)話(huà)框。我們?cè)鯓訉?shí)現(xiàn)的呢?你肯定會(huì)說(shuō),我們?cè)谠O(shè)計(jì)窗口雙擊按鈕,就會(huì)自動(dòng)為我們生成類(lèi)似如下的方法:

  1. private void button1_Click(object sender, EventArgs e)  
  2. {  
  3.     MessageBox.Show("我被點(diǎn)擊了!!!");  

其實(shí),這里用到的就是事件和委托,這里的button1_Click就是符合EventHandler委托規(guī)矩的一個(gè)具體的方法,即返回值為void,參數(shù)分別是一個(gè)object和EventArgs。

我們可以在Form1.Designer.cs中看到如下代碼:

  1. this.button1.Click += new System.EventHandler(this.button1_Click); 

可以看到,這里有一個(gè)Click事件,然后將一個(gè)委托實(shí)例附加到這個(gè)事件上,跟我們前面講的控制臺(tái)應(yīng)用程序中的用法是完全一樣的。那這個(gè)Click事件是怎么觸發(fā)的呢?對(duì)于這些系統(tǒng)類(lèi)的事件,并不用我們管。

當(dāng)然,我們也可以定義自己的事件和委托,例如我定義一個(gè)事件,這個(gè)事件就是輸出對(duì)象的名字。

這個(gè)事件就是輸出對(duì)象的名字 

我們這里定義了一個(gè)ShowName委托和一個(gè)btnclick事件。并且,在button1_Click()方法中觸發(fā)這個(gè)btnclick事件。***的結(jié)果是,當(dāng)我們點(diǎn)擊按鈕的時(shí)候,首先彈出一個(gè)“我被點(diǎn)擊了!!!”的對(duì)話(huà)框,然后確定之后再?gòu)棾隽硪粋€(gè)顯示按鈕名稱(chēng)的對(duì)話(huà)框:

另一個(gè)顯示按鈕名稱(chēng)的對(duì)話(huà)框 

C#委托與事件的相關(guān)內(nèi)容介紹到這里,希望對(duì)大家會(huì)有幫助。

【編輯推薦】

  1. C#發(fā)送Email郵件的方法解析
  2. 解析C#中is和as操作符的用法
  3. C# Excel COM組件的使用
  4. 如何判斷C#字符串是全角還是半角
  5. C#語(yǔ)言規(guī)范之小結(jié)
責(zé)任編輯:book05 來(lái)源: 網(wǎng)易博客
相關(guān)推薦

2011-07-27 12:58:43

Android MarAndroid應(yīng)用商店

2019-03-22 10:20:39

加速Windows 10啟動(dòng)

2023-09-01 18:20:43

Chrome代碼測(cè)試版

2011-07-29 15:02:22

LifeSize視頻協(xié)作

2020-12-10 20:00:04

數(shù)字貨幣比特幣區(qū)塊鏈

2023-05-15 17:00:33

聯(lián)想VMware

2015-10-19 14:57:51

2009-11-30 18:35:05

BizSparkDreamSparkWebSiteSpar

2014-01-08 10:22:28

思科Videoscape

2009-12-28 10:08:07

OracleSQLDevelope開(kāi)發(fā)框架

2024-05-10 15:09:34

2010-03-15 09:40:19

Windows 8研發(fā)

2020-09-22 10:49:12

大數(shù)據(jù)旅游技術(shù)

2013-06-17 11:53:49

思科云服務(wù)思科

2021-04-05 18:06:36

谷歌安卓Google Play

2009-03-31 11:12:59

萬(wàn)兆以太網(wǎng)

2019-11-21 12:56:43

EasyStack

2017-09-18 15:04:11

VMwareNSX容器

2014-11-13 15:54:23

Imperva亞馬遜

2020-12-17 09:48:35

人工智能開(kāi)發(fā)醫(yī)療
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩在线xx | 亚洲一区二区三区在线观看免费 | 欧美一页| 日韩欧美精品在线 | 成人三级视频 | 综合久久久久 | 日本 欧美 国产 | 国产欧美一区二区三区久久 | 午夜影晥 | 久久人体| 日韩视频在线一区 | 91欧美精品成人综合在线观看 | 欧美精品99 | 2018国产大陆天天弄 | 国产精品美女久久久久aⅴ国产馆 | 精品一区二区三区免费毛片 | 日韩一级黄色毛片 | 中文字幕日韩欧美一区二区三区 | 亚洲精品成人av久久 | 日韩福利视频 | 天天躁日日躁狠狠的躁天龙影院 | 日韩国产在线 | 欧美日韩在线成人 | 色婷综合网 | 91久色 | 99精品一区二区 | 99精品99久久久久久宅男 | 久久精品一级 | 亚洲国产一区二区三区在线观看 | 国产欧美精品一区二区色综合 | 中文字幕免费观看 | 成人国产一区二区三区精品麻豆 | 精品国产乱码 | 亚洲欧美一区二区三区在线 | 久久久精品一区 | 国产欧美三区 | 欧美午夜视频 | 成人精品一区亚洲午夜久久久 | 亚洲视频二区 | 亚洲视频一区在线观看 | 日韩一级二级片 |