日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
C#類型轉(zhuǎn)化的五點(diǎn)心得

對(duì)于這種C#類型轉(zhuǎn)化我們通常用兩種選擇:使用as操作符,或者使用強(qiáng)制轉(zhuǎn)型。當(dāng)然還有一個(gè)做法是先用is測(cè)試轉(zhuǎn)換是否可行,然后再用as或者強(qiáng)制轉(zhuǎn)換。

創(chuàng)新互聯(lián)主營(yíng)柳河網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,重慶APP開(kāi)發(fā)公司,柳河h5成都微信小程序搭建,柳河網(wǎng)站營(yíng)銷推廣歡迎柳河等地區(qū)企業(yè)咨詢

本文主要給大家提醒一些使用C#類型轉(zhuǎn)化時(shí)需要注意的地方,或許你更想弄清楚as和強(qiáng)制轉(zhuǎn)換的區(qū)別和使用場(chǎng)景,不用著急,看完,本文你自己就知道答案了,那么上面提到的兩種C#類型轉(zhuǎn)化我們需要注意哪些呢?

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ò)誤代碼示例:

 
 
 
  1. classA  
  2. {  
  3.  
  4. }  
  5. classC  
  6. {  
  7. publicstaticimplicitoperatorA(Ct)  
  8. {  
  9. returnnewA();  
  10. }  
  11. }  
  12. classProgram  
  13. {  
  14. staticvoidMain(string[]args)  
  15. {  
  16. objecto=Factory.GetObject();  
  17. //o為一個(gè)C類型:  
  18. Aa=oasA;//轉(zhuǎn)型失敗,o的類型不是A  
  19. }  

代碼已經(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ò)誤示例:

 
 
 
  1. classA  
  2. {  
  3.  
  4. }  
  5. classB:A  
  6. {  
  7.  
  8. }  
  9. classProgram  
  10. {  
  11. staticvoidMain(string[]args)  
  12. {  
  13. Bb;  
  14. Aa=(A)b;  
  15. }  
  16. }  
  17. 問(wèn)題不用多言,as可以解決這個(gè)問(wèn)題。  
  18.  
  19.  
  20. 3,看一個(gè)示例:  
  21.  
  22. classA  
  23. {  
  24.  
  25. }  
  26. classC  
  27. {  
  28. publicstaticimplicitoperatorA(Ct)  
  29. {  
  30. returnnewA();  
  31. }  
  32. }  
  33. classB:A  
  34. {  
  35.  
  36. }  
  37. classProgram  
  38. {  
  39. staticvoidMain(string[]args)  
  40. {  
  41. Aa=newB();  
  42. Bb=(B)a;  
  43. Cc=newC();  
  44. a=(A)c;  
  45. }  
  46. }  
  47. 對(duì)于Bb=(B)a;的IL代碼如下:  
  48.  
  49. IL_0008:castclassConsoleApplication1.B  
  50.  
  51. 對(duì)于a=(A)c;的IL代碼如下:  
  52.  
  53. IL_0015:callclassConsoleApplication1.AConsoleApplication1.C::op_Implicit(classConsoleApplication1.C)  
  54. 區(qū)別大家已經(jīng)看到了,要說(shuō)真正認(rèn)識(shí)區(qū)別那么我們要繼續(xù)談“4、用戶自定義轉(zhuǎn)換只作用于對(duì)象的編譯時(shí)類型。"  
  55.  
  56. 4,看一個(gè)示例:  
  57.  
  58. classA  
  59. {  
  60.  
  61. }  
  62. classC  
  63. {  
  64. publicstaticimplicitoperatorA(Ct)  
  65. {  
  66. returnnewA();  
  67. }  
  68. }  
  69. classB:A  
  70. {  
  71.  
  72. }  
  73. classProgram  
  74. {  
  75. staticvoidMain(string[]args)  
  76. {  
  77. Aa=newB();  
  78. Bb=(B)a;  
  79. objectc=newC();  
  80. a=(A)c;//編譯通過(guò),運(yùn)行失?。? 
  81. }  

也許你從來(lái)沒(méi)想過(guò)a=(A)c;編譯會(huì)成功,運(yùn)行會(huì)出錯(cuò)在這句,畢竟我們有一個(gè)顯示類型C到類型A的轉(zhuǎn)換操作,我們看看IL代碼即可找到答案,

 
 
 
  1. .methodprivatehidebysigstaticvoidMain(string[]args)cilmanaged  
  2. {  
  3. .entrypoint  
  4. //Codesize28(0x1c)  
  5. .maxstack1  
  6. .localsinit([0]classConsoleApplication1.Aa,  
  7. [1]classConsoleApplication1.Bb,  
  8. [2]objectc)  
  9. IL_0000:nop  
  10. IL_0001:newobjinstancevoidConsoleApplication1.B::.ctor()  
  11. IL_0006:stloc.0  
  12. IL_0007:ldloc.0  
  13. IL_0008:castclassConsoleApplication1.B  
  14. IL_000d:stloc.1  
  15. IL_000e:newobjinstancevoidConsoleApplication1.C::.ctor()  
  16. IL_0013:stloc.2  
  17. IL_0014:ldloc.2  
  18. IL_0015:castclassConsoleApplication1.A  
  19. IL_001a:stloc.0  
  20. IL_001b:ret  
  21. }//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沒(méi)有自定義轉(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)代碼修改為:

 
 
 
  1. objectc=newC();  
  2. Ccc=casC;  
  3. 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è))

 
 
 
  1. publicvoidUseCollection(IEnumerabletheCollection)  
  2. {  
  3. foreach(MyTypetintheCollection)  
  4. t.DoStuff();  
  5. }  
  6.  
  7. //上面代碼等同于:  
  8.  
  9. publicvoidUseCollection(IEnumerabletheCollection)  
  10. {  
  11. IEnumeratorit=hteCollection.GetEnumerator();  
  12. while(it.MoveNext())  
  13. {  
  14. MyTypet=(MyType)it.Current;  
  15. t.DoStuff();  
  16. }  

通過(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不支持值類型。

好了,5點(diǎn)C#類型轉(zhuǎn)化說(shuō)明已經(jīng)解釋完了,你現(xiàn)在還想問(wèn)as和強(qiáng)制轉(zhuǎn)換的區(qū)別和使用場(chǎng)景么?,歡迎提出批評(píng)、指正錯(cuò)誤。


文章題目:C#類型轉(zhuǎn)化的五點(diǎn)心得
分享鏈接:http://www.5511xx.com/article/dpocecc.html