這篇文章給大家分享的是有關C#類型轉(zhuǎn)化需要注意什么的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
創(chuàng)新互聯(lián)服務項目包括湘陰網(wǎng)站建設、湘陰網(wǎng)站制作、湘陰網(wǎng)頁制作以及湘陰網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網(wǎng)行業(yè)的解決方案,湘陰網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到湘陰省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
1、as和is操作符都不執(zhí)行任何用戶自定義的轉(zhuǎn)換。
2、對于強制轉(zhuǎn)換,引用為空將會轉(zhuǎn)換出錯。
3、強制轉(zhuǎn)換任意類型和自定義轉(zhuǎn)換兩種情況的IL代碼展示有區(qū)別。
4、用戶自定義轉(zhuǎn)換只作用于對象的編譯時類型。
5、as操作符不能應用于值類型。
6、foreach循環(huán)語句中使用強制類型轉(zhuǎn)型。
下面我們逐一進行介紹說明:
1,我們先來看錯誤代碼示例:
classA { } classC { publicstaticimplicitoperatorA(Ct) { returnnewA(); } } classProgram { staticvoidMain(string[]args) { objecto=Factory.GetObject(); //o為一個C類型: Aa=oasA;//轉(zhuǎn)型失敗,o的類型不是A } }
代碼已經(jīng)很明顯,我們不可以因為定義了C到A的強制轉(zhuǎn)換,就使用as,對應用戶自定義轉(zhuǎn)換,我們只可以使用(A)o轉(zhuǎn)換,其實自定義轉(zhuǎn)換和自定義操作=、+、-、"、%等操作符是一樣的機理,這樣你就明白為什么用as不可以使用自定義轉(zhuǎn)換了。
2,還是看一個錯誤示例:
classA { } classB:A { } classProgram { staticvoidMain(string[]args) { Bb; Aa=(A)b; } } 問題不用多言,as可以解決這個問題。 3,看一個示例: classA { } classC { publicstaticimplicitoperatorA(Ct) { returnnewA(); } } classB:A { } classProgram { staticvoidMain(string[]args) { Aa=newB(); Bb=(B)a; Cc=newC(); a=(A)c; } } 對于Bb=(B)a;的IL代碼如下: IL_0008:castclassConsoleApplication1.B 對于a=(A)c;的IL代碼如下: IL_0015:callclassConsoleApplication1.AConsoleApplication1.C::op_Implicit(classConsoleApplication1.C) 區(qū)別大家已經(jīng)看到了,要說真正認識區(qū)別那么我們要繼續(xù)談“4、用戶自定義轉(zhuǎn)換只作用于對象的編譯時類型。" 4,看一個示例: classA { } classC { publicstaticimplicitoperatorA(Ct) { returnnewA(); } } classB:A { } classProgram { staticvoidMain(string[]args) { Aa=newB(); Bb=(B)a; objectc=newC(); a=(A)c;//編譯通過,運行失敗! } }
也許你從來沒想過a=(A)c;編譯會成功,運行會出錯在這句,畢竟我們有一個顯示類型C到類型A的轉(zhuǎn)換操作,我們看看IL代碼即可找到答案,
.methodprivatehidebysigstaticvoidMain(string[]args)cilmanaged { .entrypoint //Codesize28(0x1c) .maxstack1 .localsinit([0]classConsoleApplication1.Aa, [1]classConsoleApplication1.Bb, [2]objectc) IL_0000:nop IL_0001:newobjinstancevoidConsoleApplication1.B::.ctor() IL_0006:stloc.0 IL_0007:ldloc.0 IL_0008:castclassConsoleApplication1.B IL_000d:stloc.1 IL_000e:newobjinstancevoidConsoleApplication1.C::.ctor() IL_0013:stloc.2 IL_0014:ldloc.2 IL_0015:castclassConsoleApplication1.A IL_001a:stloc.0 IL_001b:ret }//endofmethodProgram::Main
大家注意看IL_0015:castclassConsoleApplication1.A這句,這句說明自定義轉(zhuǎn)換在編譯時刻進行,也許你要問為什么不是第3條的:
IL_0015:callclassConsoleApplication1.AConsoleApplication1.C::op_Implicit(classConsoleApplication1.C)
因為objectc,c被定義為Object類型,那么強制轉(zhuǎn)換在編譯時刻去Object找是否存在自定義轉(zhuǎn)換操作(注意,()轉(zhuǎn)型時編譯器優(yōu)先考慮自定義轉(zhuǎn)換,找不到才進行castclass),當然Object沒有自定義轉(zhuǎn)換為A的操作,那么就使用普通的強制轉(zhuǎn)換castclass。好了現(xiàn)在我們知道了用戶自定義轉(zhuǎn)換只作用于對象的編譯時類型,而普通的Bb=(B)a;強制轉(zhuǎn)換可以作用到運行時刻。那么上面的錯誤如何去掉呢?對應代碼修改為:
objectc=newC(); Ccc=casC; a=(A)cc;
現(xiàn)在運行正常通過,好了我們再次查看IL代碼
IL_001c:callclassConsoleApplication1.AConsoleApplication1.C::op_Implicit(classConsoleApplication1.C)
到這大家對3和4點的認識應該很清楚了吧。
5、as操作符不能應用于值類型————省略!,鑒于這個點很簡單,本人就不提供示例了,大家有興趣可以自己試驗下。
6、看代碼示例:(以下代碼摘自《EffectiveC#中文版改善C#程序的50中方法》——23頁)
publicvoidUseCollection(IEnumerabletheCollection) { foreach(MyTypetintheCollection) t.DoStuff(); } //上面代碼等同于: publicvoidUseCollection(IEnumerabletheCollection) { IEnumeratorit=hteCollection.GetEnumerator(); while(it.MoveNext()) { MyTypet=(MyType)it.Current; t.DoStuff(); } }
通過查看IL代碼我們可以確認foreach語句的轉(zhuǎn)換是使用的強制轉(zhuǎn)換操作,那么為什么呢?之所以使用強制轉(zhuǎn)型,是因為foreach語句需要同時支持值類型和引用類型,這側(cè)面說明我們的第5點as不支持值類型。
感謝各位的閱讀!關于“C#類型轉(zhuǎn)化需要注意什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
分享題目:C#類型轉(zhuǎn)化需要注意什么
標題鏈接:http://bm7419.com/article40/pceoeo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導航、網(wǎng)頁設計公司、網(wǎng)站策劃、網(wǎng)站設計公司、企業(yè)網(wǎng)站制作、自適應網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)