C#使用is、as關(guān)鍵字以及顯式強(qiáng)轉(zhuǎn)實(shí)現(xiàn)引用類型轉(zhuǎn)換
在C#中,當(dāng)引用類型需要轉(zhuǎn)換的時候,經(jīng)常會用到關(guān)鍵字is、as以及顯式強(qiáng)轉(zhuǎn)。本篇來體驗(yàn)這三者的用法。
先來梳理.NET引用類型轉(zhuǎn)換的"約定俗成",或者叫"慣例":
- 子類可以隱式轉(zhuǎn)換為父類/基類,也就是"里氏替換原則"所說的:子類必須能夠替換其父類/基類。
- 父類/基類轉(zhuǎn)換為子類時,必須進(jìn)行顯式類型強(qiáng)轉(zhuǎn)。
子類轉(zhuǎn)換成父類
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; } }
輸出結(jié)果:Dog
以上,體驗(yàn)了子類轉(zhuǎn)換成父類,從中可以看出:子類Dog確實(shí)能替換父類Animal,換句話說,子類就是父類,子類的實(shí)例可以賦值給父類的變量,不需要as,不需要強(qiáng)轉(zhuǎn),一切都是隱式發(fā)生,很好地體現(xiàn)了"里氏替換原則"。
父類轉(zhuǎn)換為子類,父類變量通過子類賦值而創(chuàng)建
父類as成子類:
Animal animal = new Dog(){Name = "Dog",Age = 1}; Dog dog = animal as Dog; Console.WriteLine(dog.Name + " " + dog.Age); Console.ReadKey();
輸出結(jié)果:Dog 1
父類顯式強(qiáng)轉(zhuǎn)成子類
Animal animal = new Dog(){Name = "Dog",Age = 1}; Dog dog = (Dog)animal; Console.WriteLine(dog.Name + " " + dog.Age); Console.ReadKey();
輸出結(jié)果:Dog 1
以上,不管是使用as還是顯式強(qiáng)轉(zhuǎn),父類都可以轉(zhuǎn)換成子類,但是有前提的:把子類實(shí)例賦值給父類變量。
父類轉(zhuǎn)換為子類,父類變量通過自身構(gòu)造函數(shù)而創(chuàng)建
父類as成子類失?。?/p>
Animal animal = new Animal(){Name = "Sheep"}; Dog dog = animal as Dog; Console.WriteLine(dog.Name + " " + dog.Age); Console.ReadKey();
輸出結(jié)果:報(bào)"NullReferenceException"錯
可見,當(dāng)父類變量通過自身構(gòu)造函數(shù)而創(chuàng)建時,無法將父類轉(zhuǎn)換成子類。
(1)為了避免as的時候報(bào)"NullReferenceException"錯,引入關(guān)鍵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不能轉(zhuǎn)換為Dog"); } Console.ReadKey();
輸出結(jié)果:animal不能轉(zhuǎn)換為Dog
(2)用as做類型轉(zhuǎn)換的時候,如果轉(zhuǎn)換失敗,返回null。根據(jù)這點(diǎn),也可以通過判斷as轉(zhuǎn)換后的返回值是否為null,來避免報(bào)錯:
Animal animal = new Animal(){Name = "Sheep"}; Dog dog = animal as Dog; if (dog != null) { Console.WriteLine(dog.Name + " " + dog.Age); } else { Console.WriteLine("animal不能轉(zhuǎn)換為Dog"); } Console.ReadKey();
輸出結(jié)果:animal不能轉(zhuǎn)換為Dog
父類顯式強(qiáng)轉(zhuǎn)成子類失敗
Animal animal = new Animal(){Name = "Sheep"}; Dog dog = (Dog) animal; Console.WriteLine(dog.Name + " " + dog.Age); Console.ReadKey();
輸出結(jié)果:報(bào)"InvalidCastException"錯
可見,當(dāng)父類變量通過自身構(gòu)造函數(shù)而創(chuàng)建時,無法將父類轉(zhuǎn)換成子類。
為了避免顯示強(qiáng)轉(zhuǎn)時報(bào)"InvalidCastException"錯,引入關(guān)鍵字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不能轉(zhuǎn)換為Dog"); } Console.ReadKey();
輸出結(jié)果:animal不能轉(zhuǎn)換為Dog
總結(jié)
- 對于引用類型的轉(zhuǎn)換,應(yīng)該考慮使用顯式強(qiáng)轉(zhuǎn)或as。兩者的區(qū)別在于:一旦類型無法轉(zhuǎn)換,使用顯式強(qiáng)轉(zhuǎn)會報(bào)錯,而使用as會返回null。
- 為了避免顯式強(qiáng)轉(zhuǎn)或as所引發(fā)的報(bào)錯,應(yīng)該考慮使用is來判斷類型間是否能轉(zhuǎn)換。
- 使用as進(jìn)行引用類型轉(zhuǎn)換,不僅可以用is來判斷類型間是否能轉(zhuǎn)換,還可以通過判斷as后的返回值是否為null,然后采取相應(yīng)的操作。
- 對于基本類型的轉(zhuǎn)換:使用Convert, Parse, TryParse等。
is用于判斷類型是否一致,as和顯式強(qiáng)轉(zhuǎn)用于類型的轉(zhuǎn)換。
到此這篇關(guān)于C#實(shí)現(xiàn)引用類型轉(zhuǎn)換的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C#引用類型轉(zhuǎn)換的常見方式總結(jié)
- C#預(yù)定義的基礎(chǔ)類型轉(zhuǎn)換
- C#實(shí)現(xiàn)數(shù)組元素的數(shù)據(jù)類型轉(zhuǎn)換方法詳解
- C#處理類型和二進(jìn)制數(shù)據(jù)轉(zhuǎn)換并提高程序性能
- C#類型轉(zhuǎn)換之自定義隱式轉(zhuǎn)換和顯式轉(zhuǎn)換
- C#數(shù)據(jù)類型轉(zhuǎn)換(顯式轉(zhuǎn)型、隱式轉(zhuǎn)型、強(qiáng)制轉(zhuǎn)型)
- C#中數(shù)據(jù)類型的轉(zhuǎn)換介紹
- C# 數(shù)據(jù)類型轉(zhuǎn)換
- 詳解c# 強(qiáng)制轉(zhuǎn)換和類型轉(zhuǎn)換
- 詳解c# 類型轉(zhuǎn)換
相關(guān)文章
WinForm使用DataGridView實(shí)現(xiàn)類似Excel表格的查找替換功能
這篇文章主要介紹了WinForm使用DataGridView實(shí)現(xiàn)類似Excel表格的查找替換功能,現(xiàn)在小編通過本文給大家分享查找替換實(shí)現(xiàn)過程,需要的朋友可以參考下2021-07-07C#實(shí)現(xiàn)簡單的計(jì)算器功能完整實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)簡單的計(jì)算器功能,結(jié)合完整實(shí)例形式分析了C#實(shí)現(xiàn)常見的數(shù)學(xué)運(yùn)算、進(jìn)制轉(zhuǎn)換等相關(guān)操作技巧與界面布局方法,需要的朋友可以參考下2017-08-08C#中派生類調(diào)用基類構(gòu)造函數(shù)用法分析
這篇文章主要介紹了C#中派生類調(diào)用基類構(gòu)造函數(shù)用法,實(shí)例分析了派生類調(diào)用基類構(gòu)造函數(shù)的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04