溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#類型轉(zhuǎn)化需要注意什么

發(fā)布時(shí)間:2021-12-01 14:17:51 來(lái)源:億速云 閱讀:162 作者:小新 欄目:編程語(yǔ)言

這篇文章給大家分享的是有關(guān)C#類型轉(zhuǎn)化需要注意什么的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

1、as和is操作符都不執(zhí)行任何用戶自定義的轉(zhuǎn)換。

2、對(duì)于強(qiáng)制轉(zhuǎn)換,引用為空將會(huì)轉(zhuǎn)換出錯(cuò)。

3、強(qiáng)制轉(zhuǎn)換任意類型和自定義轉(zhuǎn)換兩種情況的IL代碼展示有區(qū)別。

4、用戶自定義轉(zhuǎn)換只作用于對(duì)象的編譯時(shí)類型。

5、as操作符不能應(yīng)用于值類型。

6、foreach循環(huán)語(yǔ)句中使用強(qiáng)制類型轉(zhuǎn)型。

下面我們逐一進(jìn)行介紹說(shuō)明:

1,我們先來(lái)看錯(cuò)誤代碼示例:

classA  {   }  classC  {  publicstaticimplicitoperatorA(Ct)  {  returnnewA();  }  }  classProgram  {  staticvoidMain(string[]args)  {  objecto=Factory.GetObject();  //o為一個(gè)C類型:  Aa=oasA;//轉(zhuǎn)型失敗,o的類型不是A  }  }

代碼已經(jīng)很明顯,我們不可以因?yàn)槎x了C到A的強(qiáng)制轉(zhuǎn)換,就使用as,對(duì)應(yīng)用戶自定義轉(zhuǎn)換,我們只可以使用(A)o轉(zhuǎn)換,其實(shí)自定義轉(zhuǎn)換和自定義操作=、+、-、"、%等操作符是一樣的機(jī)理,這樣你就明白為什么用as不可以使用自定義轉(zhuǎn)換了。


2,還是看一個(gè)錯(cuò)誤示例:

classA  {   }  classB:A  {   }  classProgram  {  staticvoidMain(string[]args)  {  Bb;  Aa=(A)b;  }  }  問(wèn)題不用多言,as可以解決這個(gè)問(wèn)題。    3,看一個(gè)示例:   classA  {   }  classC  {  publicstaticimplicitoperatorA(Ct)  {  returnnewA();  }  }  classB:A  {   }  classProgram  {  staticvoidMain(string[]args)  {  Aa=newB();  Bb=(B)a;  Cc=newC();  a=(A)c;  }  }  對(duì)于Bb=(B)a;的IL代碼如下:   IL_0008:castclassConsoleApplication1.B   對(duì)于a=(A)c;的IL代碼如下:   IL_0015:callclassConsoleApplication1.AConsoleApplication1.C::op_Implicit(classConsoleApplication1.C)  區(qū)別大家已經(jīng)看到了,要說(shuō)真正認(rèn)識(shí)區(qū)別那么我們要繼續(xù)談“4、用戶自定義轉(zhuǎn)換只作用于對(duì)象的編譯時(shí)類型。"   4,看一個(gè)示例:   classA  {   }  classC  {  publicstaticimplicitoperatorA(Ct)  {  returnnewA();  }  }  classB:A  {   }  classProgram  {  staticvoidMain(string[]args)  {  Aa=newB();  Bb=(B)a;  objectc=newC();  a=(A)c;//編譯通過(guò),運(yùn)行失??!  }  }

也許你從來(lái)沒想過(guò)a=(A)c;編譯會(huì)成功,運(yùn)行會(huì)出錯(cuò)在這句,畢竟我們有一個(gè)顯示類型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這句,這句說(shuō)明自定義轉(zhuǎn)換在編譯時(shí)刻進(jìn)行,也許你要問(wèn)為什么不是第3條的:

IL_0015:callclassConsoleApplication1.AConsoleApplication1.C::op_Implicit(classConsoleApplication1.C)

因?yàn)閛bjectc,c被定義為Object類型,那么強(qiáng)制轉(zhuǎn)換在編譯時(shí)刻去Object找是否存在自定義轉(zhuǎn)換操作(注意,()轉(zhuǎn)型時(shí)編譯器優(yōu)先考慮自定義轉(zhuǎn)換,找不到才進(jìn)行castclass),當(dāng)然Object沒有自定義轉(zhuǎn)換為A的操作,那么就使用普通的強(qiáng)制轉(zhuǎn)換castclass。好了現(xiàn)在我們知道了用戶自定義轉(zhuǎn)換只作用于對(duì)象的編譯時(shí)類型,而普通的Bb=(B)a;強(qiáng)制轉(zhuǎn)換可以作用到運(yùn)行時(shí)刻。那么上面的錯(cuò)誤如何去掉呢?對(duì)應(yīng)代碼修改為:

objectc=newC();  Ccc=casC;  a=(A)cc;

現(xiàn)在運(yùn)行正常通過(guò),好了我們?cè)俅尾榭碔L代碼

IL_001c:callclassConsoleApplication1.AConsoleApplication1.C::op_Implicit(classConsoleApplication1.C)

到這大家對(duì)3和4點(diǎn)的認(rèn)識(shí)應(yīng)該很清楚了吧。

5、as操作符不能應(yīng)用于值類型————省略!,鑒于這個(gè)點(diǎn)很簡(jiǎn)單,本人就不提供示例了,大家有興趣可以自己試驗(yàn)下。

6、看代碼示例:(以下代碼摘自《EffectiveC#中文版改善C#程序的50中方法》——23頁(yè))

publicvoidUseCollection(IEnumerabletheCollection)  {  foreach(MyTypetintheCollection)  t.DoStuff();  }   //上面代碼等同于:   publicvoidUseCollection(IEnumerabletheCollection)  {  IEnumeratorit=hteCollection.GetEnumerator();  while(it.MoveNext())  {  MyTypet=(MyType)it.Current;  t.DoStuff();  }  }

通過(guò)查看IL代碼我們可以確認(rèn)foreach語(yǔ)句的轉(zhuǎn)換是使用的強(qiáng)制轉(zhuǎn)換操作,那么為什么呢?之所以使用強(qiáng)制轉(zhuǎn)型,是因?yàn)閒oreach語(yǔ)句需要同時(shí)支持值類型和引用類型,這側(cè)面說(shuō)明我們的第5點(diǎn)as不支持值類型。

感謝各位的閱讀!關(guān)于“C#類型轉(zhuǎn)化需要注意什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI