網站首頁 編程語言 正文
在C#中,當引用類型需要轉換的時候,經常會用到關鍵字is、as以及顯式強轉。本篇來體驗這三者的用法。
先來梳理.NET引用類型轉換的"約定俗成",或者叫"慣例":
- 子類可以隱式轉換為父類/基類,也就是"里氏替換原則"所說的:子類必須能夠替換其父類/基類。
- 父類/基類轉換為子類時,必須進行顯式類型強轉。
子類轉換成父類
class Program
{
static void Main(string[] args)
{
Animal animal = new Dog(){Name = "Dog",Age = 1};
Console.WriteLine(animal.Name);
Console.ReadKey();
}
}
public class Animal
{
public string Name { get; set; }
}
public class Dog : Animal
{
public int Age { get; set; }
}
輸出結果:Dog???
以上,體驗了子類轉換成父類,從中可以看出:子類Dog確實能替換父類Animal,換句話說,子類就是父類,子類的實例可以賦值給父類的變量,不需要as,不需要強轉,一切都是隱式發生,很好地體現了"里氏替換原則"。
父類轉換為子類,父類變量通過子類賦值而創建
父類as成子類:
Animal animal = new Dog(){Name = "Dog",Age = 1};
Dog dog = animal as Dog;
Console.WriteLine(dog.Name + " " + dog.Age);
Console.ReadKey();
輸出結果:Dog 1
父類顯式強轉成子類
Animal animal = new Dog(){Name = "Dog",Age = 1};
Dog dog = (Dog)animal;
Console.WriteLine(dog.Name + " " + dog.Age);
Console.ReadKey();
輸出結果:Dog 1???
以上,不管是使用as還是顯式強轉,父類都可以轉換成子類,但是有前提的:把子類實例賦值給父類變量。??
父類轉換為子類,父類變量通過自身構造函數而創建
父類as成子類失?。?/p>
Animal animal = new Animal(){Name = "Sheep"};
Dog dog = animal as Dog;
Console.WriteLine(dog.Name + " " + dog.Age);
Console.ReadKey();
輸出結果:報"NullReferenceException"錯
可見,當父類變量通過自身構造函數而創建時,無法將父類轉換成子類。
(1)為了避免as的時候報"NullReferenceException"錯,引入關鍵is做類型判斷:
Animal animal = new Animal(){Name = "Sheep"};
if (animal is Dog)
{
Dog dog = animal as Dog;
Console.WriteLine(dog.Name + " " + dog.Age);
}
else
{
Console.WriteLine("animal不能轉換為Dog");
}
Console.ReadKey();
輸出結果:animal不能轉換為Dog
(2)用as做類型轉換的時候,如果轉換失敗,返回null。根據這點,也可以通過判斷as轉換后的返回值是否為null,來避免報錯:
Animal animal = new Animal(){Name = "Sheep"};
Dog dog = animal as Dog;
if (dog != null)
{
Console.WriteLine(dog.Name + " " + dog.Age);
}
else
{
Console.WriteLine("animal不能轉換為Dog");
}
Console.ReadKey();
輸出結果:animal不能轉換為Dog???
父類顯式強轉成子類失敗
Animal animal = new Animal(){Name = "Sheep"};
Dog dog = (Dog) animal;
Console.WriteLine(dog.Name + " " + dog.Age);
Console.ReadKey();
輸出結果:報"InvalidCastException"錯
可見,當父類變量通過自身構造函數而創建時,無法將父類轉換成子類。
為了避免顯示強轉時報"InvalidCastException"錯,引入關鍵字is做類型判斷:
Animal animal = new Animal(){Name = "Sheep"};
if (animal is Dog)
{
Dog dog = (Dog)animal;
Console.WriteLine(dog.Name + " " + dog.Age);
}
else
{
Console.WriteLine("animal不能轉換為Dog");
}
Console.ReadKey();
輸出結果:animal不能轉換為Dog
總結
- 對于引用類型的轉換,應該考慮使用顯式強轉或as。兩者的區別在于:一旦類型無法轉換,使用顯式強轉會報錯,而使用as會返回null。
- 為了避免顯式強轉或as所引發的報錯,應該考慮使用is來判斷類型間是否能轉換。
- 使用as進行引用類型轉換,不僅可以用is來判斷類型間是否能轉換,還可以通過判斷as后的返回值是否為null,然后采取相應的操作。
- 對于基本類型的轉換:使用Convert, Parse, TryParse等。
is用于判斷類型是否一致,as和顯式強轉用于類型的轉換。
原文鏈接:https://www.cnblogs.com/darrenji/p/3831421.html
相關推薦
- 2022-10-06 Redis位圖bitmap操作_Redis
- 2022-08-30 MongoD管理數據庫的方法介紹_MongoDB
- 2023-12-21 npm ERR! code EPERM npm ERR! syscall unlink npm ER
- 2022-06-06 python可視化數據分析pyecharts初步嘗試_python
- 2022-07-09 關于 Angular 應用 Module 的 forRoot 方法的討論
- 2022-10-06 python標準庫學習之sys模塊詳解_python
- 2022-09-13 EvenLoop模型在iOS的RunLoop應用示例_Swift
- 2022-09-13 iOS自定義相機功能_IOS
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支