電子課件本章常見錯誤_第1頁
電子課件本章常見錯誤_第2頁
電子課件本章常見錯誤_第3頁
電子課件本章常見錯誤_第4頁
電子課件本章常見錯誤_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論