一、型別轉換
先介紹兩個前置知識:
一是C#代碼會經過編譯期和運行期兩個狀態,前者表示代碼是否通過語法檢驗,后者表示代碼在用戶使用程序中,
二是C#的所有型別都是從System.Object派生的(其中Object類等于object關鍵字),
在繼承關系中,使用基類代替派生類作為欄位/屬性型別、引數型別或回傳值型別比使用派生類本身要好用得多,代碼如下:
1 /// <summary> 2 /// 會員 3 /// </summary> 4 public abstract class Member //隱式繼承于object 5 { 6 /// <summary> 7 /// 積分 8 /// </summary> 9 protected int score; 10 /// <summary> 11 /// 添加積分 12 /// </summary> 13 /// <param name="num"></param> 14 public abstract void AddIntegral(int num); 15 } 16 /// <summary> 17 /// 青銅會員 18 /// </summary> 19 public class BronzeMember : Member 20 { 21 public override void AddIntegral(int num) 22 { 23 score = score + num; 24 } 25 } 26 /// <summary> 27 /// 白銀會員 28 /// </summary> 29 public class SilverMember : Member 30 { 31 public override void AddIntegral(int num) 32 { 33 score = score + num * 2; 34 } 35 } 36 /// <summary> 37 /// 游戲 38 /// </summary> 39 public class Game //隱式繼承于object 40 { 41 //使用基類Member作為引數型別,可以使該引數更具通用性,因為繼承的轉換規則允許基類參考中保存派生類的實體,即引數generalMember可以是Member類下的所有派生類 42 public static void PlayGame(Member generalMember) 43 { 44 //進行游戲 45 //游戲結束后添加積分 46 generalMember.AddIntegral(2); 47 } 48 } 49 /// <summary> 50 /// 實作 51 /// </summary> 52 public class RealizeObject //隱式繼承于object 53 { 54 public void Realize() 55 { 56 //C#允許派生類直接向基類轉換,即隱式轉換 57 Member bronze = new BronzeMember(); 58 Game.PlayGame(bronze); 59 //因為SilverMember派生于Member,Member派生于object,所以object可以保存SilverMember的實體 60 object silver = new SilverMember(); 61 //基類object直接鏌饃生類Member轉換會發生編譯時錯誤(即語法驗證不通過),此時如果使用對應型別的強制轉換符則編譯可通過 62 Game.PlayGame((SilverMember)silver); 63 } 64 }
如果silver物件的實作型別與強制轉換的型別非繼承關系,則在運行時會出現例外,此時處理方式除了使用結構化例外處理外,C#還提供了更加簡潔和快速的方式as和is關鍵字,
二、as和is關鍵字
1 public class GoldMember 2 { 3 4 } 5 public class RealizeObject 6 { 7 public void Realize() 8 { 9 object goldMember = new GoldMember(); 10 //is關鍵字檢驗is左邊的物件是否與右邊兼容,兼容則回傳true,不兼容則回傳false 11 if (goldMember is Member) 12 { 13 Game.PlayGame((Member)goldMember); 14 } 15 //as關鍵字檢驗as左邊的物件是否與右邊兼容,兼容則把物件轉換成as右邊的型別并回傳,不兼容則回傳NULL 16 Member gold = goldMember as Member; 17 if (goldMember != null) 18 { 19 Game.PlayGame(gold); 20 } 21 } 22 }
is關鍵字與as關鍵字的相同點:1、它們都為型別轉換時作檢查;2、它們永遠不會拋出例外,
is關鍵字與as關鍵字的不同點:1、檢查回傳結果不一樣;2、前者需要進行兩次型別檢查,后者需要進行一次和判斷一次,性能優于前者,
is關鍵字適用于判斷物件是否兼容某個型別,重點在判斷,
as關鍵字適用于檢查物件并轉換為某個型別,重點在轉換,
總結:型別轉換在繼承關系中,C#允許派生類直接向基類轉換(隱式轉換),反之如果基類直接鏌饃生類轉換會發生編譯時錯誤(即語法驗證不通過),此時如果使用對應型別的強制轉換符則編譯可通過(顯示轉換),但如果此物件的實作型別與強制轉換的型別非繼承關系,則在運行時會出現例外,此時處理方式除了使用結構化例外處理外,C#還提供了更加簡潔和快速的方式as和is關鍵字(as適于轉換,is適于判斷),
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/122532.html
標籤:C#
上一篇:ABP入門教程3 - 解決方案
下一篇:VS中常用C#代碼段快速輸入總結
