91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#類型轉化需要注意什么

發布時間:2021-12-01 14:17:51 來源:億速云 閱讀:170 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關C#類型轉化需要注意什么的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

1、as和is操作符都不執行任何用戶自定義的轉換。

2、對于強制轉換,引用為空將會轉換出錯。

3、強制轉換任意類型和自定義轉換兩種情況的IL代碼展示有區別。

4、用戶自定義轉換只作用于對象的編譯時類型。

5、as操作符不能應用于值類型。

6、foreach循環語句中使用強制類型轉型。

下面我們逐一進行介紹說明:

1,我們先來看錯誤代碼示例:

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

代碼已經很明顯,我們不可以因為定義了C到A的強制轉換,就使用as,對應用戶自定義轉換,我們只可以使用(A)o轉換,其實自定義轉換和自定義操作=、+、-、"、%等操作符是一樣的機理,這樣你就明白為什么用as不可以使用自定義轉換了。


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)  區別大家已經看到了,要說真正認識區別那么我們要繼續談“4、用戶自定義轉換只作用于對象的編譯時類型。"   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的轉換操作,我們看看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這句,這句說明自定義轉換在編譯時刻進行,也許你要問為什么不是第3條的:

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

因為objectc,c被定義為Object類型,那么強制轉換在編譯時刻去Object找是否存在自定義轉換操作(注意,()轉型時編譯器優先考慮自定義轉換,找不到才進行castclass),當然Object沒有自定義轉換為A的操作,那么就使用普通的強制轉換castclass。好了現在我們知道了用戶自定義轉換只作用于對象的編譯時類型,而普通的Bb=(B)a;強制轉換可以作用到運行時刻。那么上面的錯誤如何去掉呢?對應代碼修改為:

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

現在運行正常通過,好了我們再次查看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語句的轉換是使用的強制轉換操作,那么為什么呢?之所以使用強制轉型,是因為foreach語句需要同時支持值類型和引用類型,這側面說明我們的第5點as不支持值類型。

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

松江区| 台湾省| 吉安县| 仁寿县| 天长市| 班戈县| 杨浦区| 旬邑县| 柳河县| 清水县| 儋州市| 融水| 洪泽县| 木里| 邳州市| 凤凰县| 湖南省| 奉贤区| 长岛县| 武汉市| 湛江市| 巫山县| 岗巴县| 琼海市| 获嘉县| 上饶县| 塔河县| 靖宇县| 清苑县| 大理市| 陆河县| 衡阳市| 南川市| 长兴县| 泸西县| 德阳市| 青田县| 屏东县| 河北区| 临洮县| 莲花县|