版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
本章常見錯誤
本講大綱:1、使用結(jié)構(gòu)實(shí)現(xiàn)接口的問題支持網(wǎng)站:2、構(gòu)造方法中調(diào)用虛方法的錯誤3、泛型在不被指定的情況下是不確定的類型?使用結(jié)構(gòu)實(shí)現(xiàn)接口的問題(1)結(jié)構(gòu)與類有一個重要的區(qū)別是結(jié)構(gòu)不支持繼承,也就是說不可以定義一個繼承自類或其它結(jié)構(gòu)的結(jié)構(gòu)。根據(jù)這個區(qū)別,有些人會作出這樣的推理:既然結(jié)構(gòu)不支持繼承,那么當(dāng)然也不可以實(shí)現(xiàn)接口。果真如此嗎?如下面的例子所示。使用結(jié)構(gòu)實(shí)現(xiàn)接口,具體代碼如下:classProgram{staticvoidMain(string[]args){TestStructts=newTestStruct();//創(chuàng)建結(jié)構(gòu)TestStruct的實(shí)例
Console.WriteLine("遍歷并輸出結(jié)構(gòu)中的內(nèi)容:");foreach(intitemints)//遍歷TestStruct結(jié)構(gòu)中的內(nèi)容
{Console.WriteLine(item);//輸出內(nèi)容
}Console.Read();}}//結(jié)構(gòu)實(shí)現(xiàn)IEnumerable接口structTestStruct:IEnumerable{publicIEnumeratorGetEnumerator()//實(shí)現(xiàn)IEnumerable中的方法,創(chuàng)建迭代器
{int[]ints=newint[]{0,1,2};for(inti=0;i<ints.Length;i++)//循環(huán)數(shù)組
{yieldreturnints[i];//使用yieldreturn語句依次返回每個元素
}}}使用結(jié)構(gòu)實(shí)現(xiàn)接口的問題(2)上面的代碼中,首先創(chuàng)建一個實(shí)現(xiàn)了IEnumerable接口的結(jié)構(gòu),并通過實(shí)現(xiàn)接口的GetEnumerator方法使該結(jié)構(gòu)具有迭代的功能,然后在Main方法中實(shí)例化該結(jié)構(gòu),最后使用foreach語句遍歷該結(jié)構(gòu)的內(nèi)容。編譯和運(yùn)行上面的程序,一切都正常,運(yùn)行結(jié)果如圖所示。
從運(yùn)行結(jié)果中得出的結(jié)論就是,結(jié)構(gòu)不支持繼承,但可以實(shí)現(xiàn)接口。構(gòu)造方法中調(diào)用虛方法的錯誤(1)
C#是一種完全面向?qū)ο蟮恼Z言,構(gòu)造函數(shù)和虛方法都是面向?qū)ο笾蟹浅V匾脑?,?gòu)造方法用來創(chuàng)建對象,虛方法常用來在子類中被重寫。如果在構(gòu)造方法中調(diào)用虛方法,就會引起錯誤。例如,下面演示在構(gòu)造方法中調(diào)用虛方法,實(shí)現(xiàn)過程如下:首先在Program.cs類文件中編寫3個類,名稱分別為Ref、Parent、Child,這3個類的關(guān)系如圖所示。
在這3個類中,Parent是Child的基類(或超類),Child是Parent的子類(或派生類),在這兩個類中都有對Ref類的引用。下面是這3個類的代碼:
構(gòu)造方法中調(diào)用虛方法的錯誤(2)
publicclassRef{publicstringStr="這是Ref類的一個成員";}publicclassParent//定義基類{protectedRefmy;publicParent()//構(gòu)造方法
{my=newRef();Console.WriteLine(GetString());//構(gòu)造方法中調(diào)用了虛方法
}publicvirtualstringGetString()//虛方法
{returnmy.Str;//使用了內(nèi)部成員
}}publicclassChild:Parent//定義子類,繼承自Parent{privateRefmy2;publicChild():base(){my2=newRef();}publicoverridestringGetString()//重寫虛方法
{returnmy2.Str;//使用了內(nèi)部成員
}}
說明:在Parent類的構(gòu)造方法中,調(diào)用了虛方法GetString。
構(gòu)造方法中調(diào)用虛方法的錯誤(3)在Main方法中編寫實(shí)例化Child類的代碼,具體代碼如下:classProgram{staticvoidMain(string[]args){try{Childch=newChild();//實(shí)例化Child類
}catch(Exceptionex){Console.WriteLine(ex.Message);}Console.Read();}}上面的代碼在編譯時,沒有任何問題,但在執(zhí)行時卻出現(xiàn)了異常,如圖所示。在程序的Main方法中設(shè)置斷點(diǎn),跟蹤斷點(diǎn)時發(fā)現(xiàn),在執(zhí)行Child類的構(gòu)造函數(shù)代碼之前,先執(zhí)行Parent類的構(gòu)造函數(shù),當(dāng)執(zhí)行到調(diào)用虛方法的代碼時,突然斷點(diǎn)跳轉(zhuǎn)到Child類的GetString方法體內(nèi),在執(zhí)行該方法體中的my2.str代碼時出錯,因?yàn)閙y2在Child類的構(gòu)造函數(shù)中被實(shí)例化,而此時代碼還未執(zhí)行到Child類的構(gòu)造函數(shù),所以出現(xiàn)上面的異常。該錯誤的解決方法只有一個,那就是永遠(yuǎn)不要在子類的構(gòu)造函數(shù)中調(diào)用虛方法。
泛型在不被指定的情況下是不確定的類型?(1)為了使集合的功能更強(qiáng)大,也為了提高它們的效率和可用性,在C#中引入了泛型。泛型簡言之就是將類型參數(shù)化,以達(dá)到代碼復(fù)用為目的的一種數(shù)據(jù)類型,它參數(shù)化類型,使類型抽象化,從而使其對外表現(xiàn)出更加靈活的功能。泛型的種類很廣泛,包括泛型接口、泛型類、泛型方法、泛型事件和泛型委托等。泛型的語法和概念非常類似于C++中的模板,都是為了方便設(shè)計(jì)一些更加通用的類型,而在C#中泛型還有另外一個重要作用,那就是避免容器操作中的裝箱和拆箱動作。例如,使用泛型的代碼如下://定義泛型類publicclassGenericClass<T>{Ttt;//構(gòu)造器
publicGenericClass(Tt){tt=t;}//覆蓋或重寫ToString方法
publicoverridestringToString(){returntt.ToString();}}泛型在不被指定的情況下是不確定的類型?(2)下面是GenericClass類的調(diào)用代碼:staticvoidMain(string[]args){GenericClass<string>gc=newGenericClass<string>("明日科技");//創(chuàng)建泛型對象
Console.WriteLine(gc);//輸出字符串
Console.Read();}
說明:上面代碼中為泛型傳入一個string類型的實(shí)參,實(shí)際上可以傳入任意類型的實(shí)參,如int類型,代碼如下:GenericClass<int>gc=newGenericClass<int>(999);上面代碼中聲明了一個泛型GenericClass<T>,有些人會認(rèn)為GenericClass<T>是一個不確定類型。這是對泛型的一種誤解,和C#中的眾多類型一樣,帶泛型參數(shù)的類型同樣是一個確定的類型,在不被指定的情況下,它直接繼承自System.Object類型,也就是說GenericClass<T>是System.Object類型。但是,泛型類型還是和普通類型有一定
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年居間合同的法律規(guī)定
- 房地產(chǎn)企業(yè)勞動合同格式模板
- 創(chuàng)業(yè)公司法律咨詢顧問合同
- 模板公司集體合同樣本
- 2024年婚慶服務(wù)標(biāo)準(zhǔn)合同
- 房屋認(rèn)購協(xié)議書中的物業(yè)服務(wù)條款
- 彩繪加盟合作協(xié)議書范本
- 國際貨物買賣信貸貸款契約
- 建筑安裝工程分包協(xié)議書樣本
- 農(nóng)村離婚協(xié)議書撰寫指南
- 2024年時事政治考點(diǎn)大全(173條)
- 生鮮豬肉銷售合同模板
- 2024醫(yī)療機(jī)構(gòu)重大事故隱患判定清單(試行)學(xué)習(xí)課件
- 汽車修理工崗前培訓(xùn)
- 【實(shí)用版】一年級上冊一年級語文期中復(fù)習(xí)ppt課件
- 非物質(zhì)文化遺產(chǎn)對經(jīng)濟(jì)發(fā)展的影響
- 屬鼠的人住幾樓最吉利_屬豬的人適合住幾樓
- 高教版趙耐青衛(wèi)生統(tǒng)計(jì)學(xué)習(xí)題答案
- 對山西煤礦企業(yè)托管經(jīng)營的思考要點(diǎn)
- 珠寶店培訓(xùn)第四講:服務(wù)禮儀
- (完整版)安全通道防護(hù)棚施工方案
評論
0/150
提交評論