版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
委托和事件
委托基本概念
委托,顧名思義,就是中間代理人的意思。通俗地說(shuō),委托是一個(gè)可以引用方法的類(lèi)型,當(dāng)你創(chuàng)建一個(gè)委托,也就創(chuàng)建了一個(gè)引用方法的對(duì)象,進(jìn)而就可以調(diào)用那個(gè)方法,即是說(shuō)委托可以調(diào)用它所指向的方法。實(shí)際委托和C++函數(shù)指針很類(lèi)似,但具有更高的安全性。而且委托引用的方法可以改變,這樣同一個(gè)委托就可以調(diào)用多個(gè)不同的方法。委托類(lèi)型派生自.NETFramework中的Delegate
類(lèi)。委托類(lèi)型是密封的,不能從Delegate中派生委托類(lèi)型,也不可能從中派生自定義類(lèi)。
C#中委托的具體的步驟是:
(1)聲明一個(gè)委托,其參數(shù)形式一定要和想要包含的方法的參數(shù)形式一致。
(2)定義所有你要定義的方法,其參數(shù)形式和第一步中聲明的委托對(duì)象的參數(shù)形式必須相同。
(3)創(chuàng)建委托對(duì)象并將所希望的方法包含在該委托對(duì)象中。
(4)通過(guò)委托對(duì)象調(diào)用包含在其中的各個(gè)方法。
步驟1:聲明一個(gè)委托
格式:
[修飾符]delegate返回類(lèi)型委托名(參數(shù)列表);
例:
publicdelegatevoidMyDelegate1(stringinput);
publicdelegatedoubleMyDelegate2();
聲明一個(gè)委托的對(duì)象,與聲明一個(gè)普通類(lèi)對(duì)象的方式一樣:委托名委托對(duì)象名;例:MyDelegate1a;MyDelegate2b;步驟2:定義方法,其參數(shù)形式和步驟1中聲明的委托對(duì)象的必須相同
classMyClass1{
publicvoiddMethod1(stringinput){
Console.WriteLine(“Method1傳遞的參數(shù)是{0}",input);
}
publicvoiddMethod2(stringinput){
Console.WriteLine(Method1傳遞的參數(shù)是{0}",input);}
}
步驟3:創(chuàng)建一個(gè)委托對(duì)象并將上面的方法包含其中
例:
MyClass1c2=newMyClass1();MyDelegate1d1;d1=newMyDelegate1(c2.dMethod1);MyDelegate1d2=newMyDelegate1(c2.dMethod2);
步驟4:通過(guò)委托對(duì)象調(diào)用包含在其中的方法
例:
d1("abc");d2("123");下面這個(gè)例子就是將上面的4個(gè)步驟合在一起:usingSystem;publicdelegatevoidMyDelegate1(stringinput);classMyClass1{
publicvoiddMethod1(stringinput)
{
Console.WriteLine("dMethod1傳遞的參數(shù)是{0}",input);?
}publicvoiddMethod2(stringinput)
{
Console.WriteLine("dMethod2傳遞的參數(shù)是{0}",input);
} }classDriver{
staticvoidMain(){
MyClass1c2=newMyClass1();?
MyDelegate1d1=newMyDelegate1(c2.dMethod1);?
MyDelegate1d2=newMyDelegate1(c2.dMethod2);?
d1("abc");
d2("123");
}
}泛型我們?cè)诰帉?xiě)程序時(shí),經(jīng)常遇到兩個(gè)模塊的功能非常相似,只是一個(gè)是處理int數(shù)據(jù),另一個(gè)是處理string數(shù)據(jù),或者其他自定義的數(shù)據(jù)類(lèi)型,但我們沒(méi)有辦法,只能分別寫(xiě)多個(gè)方法處理每個(gè)數(shù)據(jù)類(lèi)型,因?yàn)榉椒ǖ膮?shù)類(lèi)型不同。有沒(méi)有一種辦法,在方法中傳入通用的數(shù)據(jù)類(lèi)型,這樣不就可以合并代碼了嗎?泛型的出現(xiàn)就是專門(mén)解決這個(gè)問(wèn)題的。泛型簡(jiǎn)介泛型是C#2.0的最強(qiáng)大的功能。通過(guò)泛型可以定義類(lèi)型安全的數(shù)據(jù)結(jié)構(gòu),而無(wú)須使用實(shí)際的數(shù)據(jù)類(lèi)型。這能夠顯著提高性能并得到更高質(zhì)量的代碼,因?yàn)槟梢灾赜脭?shù)據(jù)處理算法,而無(wú)須復(fù)制類(lèi)型特定的代碼。在概念上,泛型類(lèi)似于C++
模板,但是在實(shí)現(xiàn)和功能方面存在明顯差異。本文討論泛型處理的問(wèn)題空間、它們的實(shí)現(xiàn)方式、該編程模型的好處,以及獨(dú)特的創(chuàng)新(例如,約束、一般方法以及一般繼承)。您還將了解在.NETFramework的其他領(lǐng)域(例如,反射、數(shù)組、集合、序列化和遠(yuǎn)程處理)中如何利用泛型,以及如何在所提供的基本功能的基礎(chǔ)上進(jìn)行改進(jìn)。C#泛型演示我們先看下面的代碼,代碼省略了一些內(nèi)容,但功能是實(shí)現(xiàn)一個(gè)棧,這個(gè)棧只能處理int數(shù)據(jù)類(lèi)型:publicclassStack
{
privateint[]m_item;
publicintPop(){...}
publicvoidPush(intitem){...}
publicStack(inti)
{
this.m_item=newint[i];
}
}上面代碼運(yùn)行的很好,但是,當(dāng)我們需要一個(gè)棧來(lái)保存string類(lèi)型時(shí),該怎么辦呢?很多人都會(huì)想到把上面的代碼復(fù)制一份,把int改成string不就行了。當(dāng)然,這樣做本身是沒(méi)有任何問(wèn)題的,但一個(gè)優(yōu)秀的程序是不會(huì)這樣做的,因?yàn)樗氲饺粢院笤傩枰猯ong、Node類(lèi)型的棧該怎樣做呢?還要再?gòu)?fù)制嗎??jī)?yōu)秀的程序員會(huì)想到用一個(gè)通用的數(shù)據(jù)類(lèi)型object來(lái)實(shí)現(xiàn)這個(gè)棧:publicclassStack
{
privateobject[]m_item;
publicobjectPop(){...}
publicvoidPush(objectitem){...}
publicStack(inti)
{
this.m_item=new[i];
}}這個(gè)棧寫(xiě)的不錯(cuò),他非常靈活,可以接收任何數(shù)據(jù)類(lèi)型,可以說(shuō)是一勞永逸。但也不是沒(méi)有缺陷的,主要表現(xiàn)在:當(dāng)Stack處理值類(lèi)型時(shí),會(huì)出現(xiàn)裝箱、折箱操作,這將在托管堆上分配和回收大量的變量,若數(shù)據(jù)量大,則性能損失非常嚴(yán)重。
在處理引用類(lèi)型時(shí),雖然沒(méi)有裝箱和折箱操作,但將用到數(shù)據(jù)類(lèi)型的強(qiáng)制轉(zhuǎn)換操作,增加處理器的負(fù)擔(dān)。在數(shù)據(jù)類(lèi)型的強(qiáng)制轉(zhuǎn)換上還有更嚴(yán)重的問(wèn)題(假設(shè)stack是Stack的一個(gè)實(shí)例):Node1x=newNode1();
stack.Push(x);
Node2y=(Node2)stack.Pop();上面的代碼在編譯時(shí)是完全沒(méi)問(wèn)題的,但由于Push了一個(gè)Node1類(lèi)型的數(shù)據(jù),但在Pop時(shí)卻要求轉(zhuǎn)換為Node2類(lèi)型,這將出現(xiàn)程序運(yùn)行時(shí)的類(lèi)型轉(zhuǎn)換異常,但卻逃離了編譯器的檢查。針對(duì)object類(lèi)型棧的問(wèn)題,我們引入泛型,他可以優(yōu)雅地解決這些問(wèn)題。泛型用用一個(gè)通過(guò)的數(shù)據(jù)類(lèi)型T來(lái)代替object,在類(lèi)實(shí)例化時(shí)指定T的類(lèi)型,運(yùn)行時(shí)(Runtime)自動(dòng)編譯為本地代碼,運(yùn)行效率和代碼質(zhì)量都有很大提高,并且保證數(shù)據(jù)類(lèi)型安全。使用泛型
下面是用泛型來(lái)重寫(xiě)上面的棧,用一個(gè)通用的數(shù)據(jù)類(lèi)型T來(lái)作為一個(gè)占位符,等待在實(shí)例化時(shí)用一個(gè)實(shí)際的類(lèi)型來(lái)代替。讓我們來(lái)看看泛型的威力:publicclassStack<T>
{
privateT[]m_item;
publicTPop(){...}
publicvoidPush(Titem){...}
publicStack(inti)
{
this.m_item=newT[i];
}
}類(lèi)的寫(xiě)法不變,只是引入了通用數(shù)據(jù)類(lèi)型T就可以適用于任何數(shù)據(jù)類(lèi)型,并且類(lèi)型安全的。這個(gè)類(lèi)的調(diào)用方法:實(shí)例化只能保存int類(lèi)型的類(lèi)Stack<int>a=newStack<int>(100);
a.Push(10);
a.Push("8888");//這一行編譯不通過(guò),因?yàn)轭?lèi)a只接收int類(lèi)型的數(shù)據(jù)
intx=a.Pop();實(shí)例化只能保存string類(lèi)型的類(lèi)Stack<string>b=newStack<string>(100);
b.Push(10);//這一行編譯不通過(guò),因?yàn)轭?lèi)b只接收string類(lèi)型的數(shù)據(jù)
b.Push("8888");
stringy=b.Pop();泛型類(lèi)和object實(shí)現(xiàn)的類(lèi)的區(qū)別他是類(lèi)型安全的。實(shí)例化了int類(lèi)型的棧,就不能處理string類(lèi)型的數(shù)據(jù),其他數(shù)據(jù)類(lèi)型也一樣。無(wú)需裝箱和折箱。這個(gè)類(lèi)在實(shí)例化時(shí),按照所傳入的數(shù)據(jù)類(lèi)型生成本地代碼,本地代碼數(shù)據(jù)類(lèi)型已確定,所以無(wú)需裝箱和折箱。無(wú)需類(lèi)型轉(zhuǎn)換。泛型概述使用泛型類(lèi)型可以最大限度地重用代碼、保護(hù)類(lèi)型的安全以及提高性能。泛型最常見(jiàn)的用途是創(chuàng)建集合類(lèi)。.NETFramework類(lèi)庫(kù)在System.Collections.Generic命名空間中包含幾個(gè)新的泛型集合類(lèi)。應(yīng)盡可能地使用這些類(lèi)來(lái)代替普通的類(lèi),如System.Collections命名空間中的ArrayList。您可以創(chuàng)建自己的泛型接口、泛型類(lèi)、泛型方法、泛型事件和泛型委托??梢詫?duì)泛型類(lèi)進(jìn)行約束以訪問(wèn)特定數(shù)據(jù)類(lèi)型的方法。關(guān)于泛型數(shù)據(jù)類(lèi)型中使用的類(lèi)型的信息可在運(yùn)行時(shí)通過(guò)反射獲取。泛型類(lèi)如何實(shí)例化C#泛型類(lèi)在編譯時(shí),先生成中間代碼IL,通用類(lèi)型T只是一個(gè)占位符。在實(shí)例化類(lèi)時(shí),根據(jù)用戶指定的數(shù)據(jù)類(lèi)型代替T并由即時(shí)編譯器(JIT)生成本地代碼,這個(gè)本地代碼中已經(jīng)使用了實(shí)際的數(shù)據(jù)類(lèi)型,等同于用實(shí)際類(lèi)型寫(xiě)的類(lèi),所以不同的封閉類(lèi)的本地代碼是不一樣的泛型類(lèi)中數(shù)據(jù)類(lèi)型的約束
程序員在編寫(xiě)泛型類(lèi)時(shí),總是會(huì)對(duì)通用數(shù)據(jù)類(lèi)型T進(jìn)行有意或無(wú)意地有假想,也就是說(shuō)這個(gè)T一般來(lái)說(shuō)是不能適應(yīng)所有類(lèi)型,但怎樣限制調(diào)用者傳入的數(shù)據(jù)類(lèi)型呢?這就需要對(duì)傳入的數(shù)據(jù)類(lèi)型進(jìn)行約束,約束的方式是指定T的祖先,即繼承的接口或類(lèi)。因?yàn)镃#的單根繼承性,所以約束可以有多個(gè)接口,但最多只能有一個(gè)類(lèi),并且類(lèi)必須在接口之前。這時(shí)就用到了C#2.0的新增關(guān)鍵字where:publicclassNode<T,V>whereT:Stack,IComparable
whereV:Stack
{...}以上的泛型類(lèi)的約束表明,T必須是從Stack和IComparable繼承,V必須是Stack或從Stack繼承,否則將無(wú)法通過(guò)編譯器的類(lèi)型檢查,編譯失敗。泛型方法
泛型不僅能作用在類(lèi)上,也可單獨(dú)用在類(lèi)的方法上,他可根據(jù)方法參數(shù)的類(lèi)型自動(dòng)適應(yīng)各種參數(shù),這樣的方法叫泛型方法。看下面的類(lèi):publicclassStack2
{
publicvoidPush<T>(Stack<T>s,paramsT[]p)
{
foreach(Ttinp)
{
s.Push(t);
}
}
}原來(lái)的類(lèi)Stack一次只能Push一個(gè)數(shù)據(jù),這個(gè)類(lèi)Stack2擴(kuò)展了Stack的功能(當(dāng)然也可以直接寫(xiě)在Stack中),他可以一次把多個(gè)數(shù)據(jù)壓入Stack中。其中Push是一個(gè)泛型方法,這個(gè)方法的調(diào)用示例如下:Stack<int>x=newStack<int>(100);
Stack2x2=newStack2();
x2.Push(x,1,2,3,4,6);
strings="";
for(inti=0;i<5;i++)
{
s+=x.Pop().ToString();
}//至此,s的值為64321泛型中的靜態(tài)成員變量
在C#1.x中,我們知道類(lèi)的靜態(tài)成員變量在不同的類(lèi)實(shí)例間是共享的,并且他是通過(guò)類(lèi)名訪問(wèn)的。C#2.0中由于引進(jìn)了泛型,導(dǎo)致靜態(tài)成員變量的機(jī)制出現(xiàn)了一些變化:靜態(tài)成員變量在相同封閉類(lèi)間共享,不同的封閉類(lèi)間不共享。這也非常容易理解,因?yàn)椴煌姆忾]類(lèi)雖然有相同的類(lèi)名稱,但由于分別傳入了不同的數(shù)據(jù)類(lèi)型,他們是完全不同的類(lèi),比如:Stack<int>a=newStack<int>();
Stack<int>b=newStack<int>();
Stack<long>c=newStack<long>();類(lèi)實(shí)例a和b是
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《過(guò)敏性紫癜曹偉》課件
- 《代商務(wù)禮儀》課件
- 《確定市場(chǎng)調(diào)研目標(biāo)》課件
- 房屋租賃合同(2篇)
- 《硬盤(pán)使用前的處理》課件
- 2024年汽輪機(jī)油產(chǎn)品研發(fā)與技術(shù)轉(zhuǎn)移合作協(xié)議3篇
- 2025年鄭州貨運(yùn)從業(yè)資格證題庫(kù)
- 2025年昌都貨運(yùn)從業(yè)資格證考試模擬考試題庫(kù)下載
- 2024年混凝土構(gòu)件生產(chǎn)及安裝合同
- 2025年濟(jì)南道路運(yùn)輸從業(yè)人員從業(yè)資格考試
- 監(jiān)理公司各部門(mén)職責(zé)
- 253種中藥材粉末顯微鑒別主要特征
- 論辛棄疾詞作的愁情主題及其審美價(jià)值
- 新形勢(shì)下我國(guó)保險(xiǎn)市場(chǎng)營(yíng)銷(xiāo)的現(xiàn)狀、問(wèn)題及對(duì)策
- LTE無(wú)線網(wǎng)絡(luò)優(yōu)化PPT課件
- 動(dòng)態(tài)血壓監(jiān)測(cè)在社區(qū)高血壓患者管理的意義
- 管道中英文對(duì)照表
- 240燈控臺(tái)_說(shuō)明書(shū)
- 新形勢(shì)下加強(qiáng)市場(chǎng)監(jiān)管局檔案管理工作的策略
- 例行檢查和確認(rèn)檢驗(yàn)程序
- 上海旅游資源基本類(lèi)型及其旅游區(qū)布局特點(diǎn)(共5頁(yè))
評(píng)論
0/150
提交評(píng)論