成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#中 As 和強制轉換的總結

開發 后端
本文主要介紹C#中As和強制轉換,通過例子,為大家詳細介紹,從而得出結論。希望對大家有幫助,一起來看吧!

C#是一門強類型語言,一般情況下,我們***避免將一個類型強制轉換為其他類型,但有些時候難免要進行類型轉換。先想想究竟哪些操作可以進行類型轉換(先不考慮.NET提供的Parse),一般我們都有以下選擇:

  • 使用as操作符轉換,
  • 使用傳統C風格的強制轉型,
  • 使用is來做一個轉換測試,然后再使用as操作符或者強制轉換。

正確的選擇應該是盡可能地使用as操作符,因為它比強制轉型要安全,而且在運行時層面也有比較好的效率(注意的是as和is操作符都不執行任何用戶自定義的轉換,只有當運行時類型與目標轉換類型匹配時,它們才會轉換成功)。

現在我們通過一個簡單的例子說明as和強制轉換之間的區別,首先我們定義一間獲取不同類型對象的工廠,然后我們把未知類型轉換為自定義類型。

  1. object o = Factory.GetObject();   
  2. MyType t = o as MyType;   
  3. if (t == null) { //轉換成功 }   
  4. else { //轉換失敗 }   
  5. object o = Factory.GetObject();   
  6. try { MyType t = o as MyType;   
  7. if (t != null)   
  8. ////轉換成功   
  9. }   
  10. else   
  11. {   
  12. ////轉換失敗   
  13. }   
  14. }   
  15. catch   
  16. ////異常處理  
  17.  } 

通過上述代碼我們發現as類型轉換失敗時值為null不拋出異常,但強制轉換如果轉換失敗會拋出異常所以我們要添加異常處理。

現在我們對as和強制轉換有了初步的了解,假設現在我們定義了一個抽象類Foo,然后Foo1繼承于它,并且再定義一個基類Logger,在Foo1中定義與Logger類型隱式轉換具體如下:

  1. Foo1 myFoo;  
  2. //// Inherits abstract class. Logger myFoo;   
  3. //// base class. public class Foo1 : Foo { PRivate Logger _value;   
  4. /// <summary>   
  5. /// 隱式自定義類型轉換。   
  6. /// </summary>   
  7. /// <param name="foo1"></param>   
  8. /// <returns></returns>   
  9. public static implicit Operator Logger(Foo1 foo1) { return foo1._value;   
  10. }   

現在我們猜猜看以下的類型轉換是否成功(提示:從編譯和運行時類型轉換角度考慮)。

  1. object myFoo = container.Resolve<Foo>();   
  2. //獲取未Foo1類型   
  3. try { Logger myFoo1 = (Logger)myFoo;   
  4. if (myFoo1 != null)   
  5. {   
  6. Console.WriteLine("Covert successful.");   
  7. }   
  8. }   
  9. catch   
  10. {   
  11. Console.WriteLine("Covert failed.");   

相信聰明的大家已經想出答案了,激動人心的時刻到了現在讓我們公布答案:轉換失敗拋出異常。

首先我們要從編譯和運行時角度來分析,在編譯時myFoo的類型為System.Object,這時編譯器會檢測是否存在自定義由Object到Logger的類型轉換。如果沒有找到合適轉換,編譯器將生成代碼檢測myFoo的運行時類型和Logger比較,由于myFoo的運行時類型為Foo1,而且我們自定義了由Foo1到Logger的類型轉換,估計這樣可以轉換成功了吧!然而恰恰沒有轉換成功,這究竟是什么原因呢?讓我們了解一下編譯器對于隱式類型轉換的原理吧。

通過我們發現用戶自定義的轉換操作符只作用于對象的編譯時類型,而非運行時類型上,OK現在讓修改一下代碼讓我們編譯器認識自定義類型中。

 

  1. using (IUnityContainer container = new UnityContainer()) 
  2. { UnityConfigurationSection 
  3. section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");   
  4. //獲取container名稱為CfgClass下的配置   
  5. section.Containers["CfgClass"].Configure(container);   
  6. object tempFoo = container.Resolve<Foo>();   
  7. //獲取未Foo1類型   
  8. Foo1 myFoo = tempFoo as Foo1;   
  9. //使用as先把object轉型為Foo1   
  10. try { Logger myFoo1 = (Logger)myFoo;   
  11. if (myFoo1 != null) {   
  12. Console.WriteLine("Covert successful.");   
  13. }   
  14. }   
  15. catch {  
  16. Console.WriteLine("Covert failed.");   
  17. }   
  18. Console.ReadKey();   

 

現在類型可以轉換成功,這是因為編譯器使用了我們自定義的隱式轉換,由于myFoo這次的編譯類型為Foo1,編譯器首先查找是否存在Foo1和Logger自定義轉換類型,由于我們定義了一種由Foo1到Logger的隱式類型轉換所以轉換成功。

通過上述我們發現了as給我們帶來的好處,但是有一點我們要注意的是as只能用于引用類型不能用于值類型。那我就有個問題了在進行類型轉換之前如果我們并不知道要轉換的是值類型還是引用類型,那該怎么辦呢?現在是is登場的時候了。

 

  1. bject tempFoo = container.Resolve<Foo>(); //獲取未Foo1類型   
  2. int myInt = tempFoo as int//compile error 

as不能用于值類型,這是因為值類型不能為null(注意:C#2.0中,微軟提供了Nullable類型,允許用它定義包含null值,即空值的數據類型)像這種情況我們應該使用強制類型轉換。

  1. object tempFoo = container.Resolve<Foo>();   
  2. //獲取未Foo1類型   
  3. try { int myInt = (int)tempFoo;   
  4. //轉換成功   
  5. if (myFoo1 != null)   
  6. {   
  7. Console.WriteLine("Covert successful.");   
  8. }   
  9. }   
  10. catch   
  11. { Console.WriteLine("Covert failed.");   

大家可以發現和我們之前使用的強制轉換類似,而且還有處理異常,現在修改一下我們代碼讓它更加簡潔實現如下:

  1. object tempFoo = container.Resolve<Foo>();   
  2. //獲取未Foo1類型int i = 0;   
  3. //值類型轉換  
  4. if (tempFoo is int){ i = (int) tempFoo;}  
  5. object tempFoo = container.Resolve<Foo>();   
  6. //獲取未Foo1類型  
  7. Logger myFoo1 = null;   
  8. //引用類型轉換  
  9. if (tempFoo is Logger)  
  10. {   
  11. myFoo1 = tempFoo as Logger;  

總結

as和強制轉換之間***的區別就在于如何處理用戶自定義的轉換。操作符 as和 is 都只檢查被轉換對象的運行時類型,并不執行其他的操作。如果被轉換對象的運行時類型既不是所轉換的目標類型,也不是其派生類型,那么轉型將告失敗。但是強制轉型則會使用轉換操作符來執行轉型操作,這包括任何內建的數值轉換(如:long轉int)。

一般情況我們應該先考慮使用as進行類型轉換,然后再考慮使用is,***才考慮使用強制轉換。

【編輯推薦】

  1. c#.net實體類序列化方法
  2. C#中log4net使用方法(一)
  3. C#中log4Net使用方法(二)
  4. 淺析C#插件式程序開發經驗
  5. 談C#中循環結構的效率問題
責任編輯:于鐵 來源: 博客園
相關推薦

2009-08-24 14:20:13

C# 強制類型轉換

2011-06-08 13:50:39

C#類型轉換

2009-09-02 14:14:44

C# COM接口轉換

2009-08-18 15:00:00

C#強制轉換

2009-08-21 09:57:08

C#操作符IS與AS

2009-08-20 18:06:18

學習C#接口

2011-07-14 10:39:08

強制類型轉換函數C++

2010-01-28 14:38:36

C++和C#、Java

2023-01-17 14:01:19

JavaScript類型轉換字符串

2024-03-19 14:41:08

C#操作符開發

2009-08-12 18:28:49

C#強制類型轉化

2009-08-27 11:21:36

C# override

2009-08-24 09:55:26

C#接口轉換

2009-08-03 18:35:02

Boxing和UnboC#

2024-12-24 07:38:44

C#串口通信

2009-08-27 16:54:59

C#開發技巧

2024-10-05 00:00:35

Action?C#Func?

2024-05-30 12:24:03

C#開發

2009-08-13 18:02:50

C#基礎概念

2009-08-11 15:44:05

C#基本技巧
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品亚洲第一区在线暖暖韩国 | 日一区二区三区 | 亚洲视频一区二区三区四区 | 成人在线免费观看视频 | 久久亚| 玖玖玖av| 91视频导航 | 精品一区二区电影 | 九九99精品 | 中日韩欧美一级片 | 天堂久久网 | 欧美一区二区三区视频 | 免费a国产| 亚洲首页| 国产成人一区二区三区电影 | 亚洲精品一区二区三区中文字幕 | 国产一区二区在线播放 | 欧美一级黄色片 | 成人av高清| 亚洲精品永久免费 | 久久99精品久久久久久国产越南 | 欧美精品一区二区三区蜜桃视频 | 欧美video | 久久国产精品网站 | 亚洲一区二区三 | 国产视频一区在线 | 先锋资源网站 | 伊人色综合久久天天五月婷 | 中文字幕一级毛片视频 | 日韩中出| 日韩在线视频一区二区三区 | 亚洲精品久久嫩草网站秘色 | 在线久草 | 亚洲精品一区二区三区在线 | 色综合一区二区 | 亚洲在线免费 | 亚洲欧美在线视频 | 午夜免费网站 | 免费v片| 国产一级淫片免费视频 | 国产99久久 |