欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#使用is、as關(guān)鍵字以及顯式強(qiáng)轉(zhuǎn)實(shí)現(xiàn)引用類型轉(zhuǎn)換

 更新時間:2022年08月08日 08:54:29   作者:Darren?Ji  
這篇文章介紹了C#使用is、as關(guān)鍵字以及顯式強(qiáng)轉(zhuǎn)實(shí)現(xiàn)引用類型轉(zhuǎn)換的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

在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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • WinForm使用DataGridView實(shí)現(xiàn)類似Excel表格的查找替換功能

    WinForm使用DataGridView實(shí)現(xiàn)類似Excel表格的查找替換功能

    這篇文章主要介紹了WinForm使用DataGridView實(shí)現(xiàn)類似Excel表格的查找替換功能,現(xiàn)在小編通過本文給大家分享查找替換實(shí)現(xiàn)過程,需要的朋友可以參考下
    2021-07-07
  • C# 腳本引擎CS-Script的使用

    C# 腳本引擎CS-Script的使用

    這篇文章主要介紹了C#腳本引擎CS-Script的使用,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-12-12
  • C#實(shí)現(xiàn)簡單的計(jì)算器功能完整實(shí)例

    C#實(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-08
  • C#中派生類調(diào)用基類構(gòu)造函數(shù)用法分析

    C#中派生類調(diào)用基類構(gòu)造函數(shù)用法分析

    這篇文章主要介紹了C#中派生類調(diào)用基類構(gòu)造函數(shù)用法,實(shí)例分析了派生類調(diào)用基類構(gòu)造函數(shù)的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • C#、vb.net及SQL判斷指定年份是否為閏年的方法

    C#、vb.net及SQL判斷指定年份是否為閏年的方法

    這篇文章主要介紹了C#、vb.net及SQL判斷指定年份是否為閏年的方法,分別以三種方法實(shí)現(xiàn)了判斷閏年的功能,在進(jìn)行項(xiàng)目開發(fā)中具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-11-11
  • C#異步編程由淺入深(二)之Async/Await的使用

    C#異步編程由淺入深(二)之Async/Await的使用

    這篇文章主要介紹了C#異步編程由淺入深(二)之Async/Await的作用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • C# 圖片剪切與縮小的實(shí)例

    C# 圖片剪切與縮小的實(shí)例

    C# 剪切圖片與縮小的實(shí)例,需要的朋友可以參考一下
    2013-04-04
  • C#中截取字符串的的基本方法詳解

    C#中截取字符串的的基本方法詳解

    這篇文章主要介紹了C#中截取字符串的的基本方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 詳解c# 類型轉(zhuǎn)換

    詳解c# 類型轉(zhuǎn)換

    這篇文章主要介紹了c# 類型轉(zhuǎn)換的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以學(xué)習(xí)
    2020-07-07
  • C#使用Thrift作為RPC框架入門詳細(xì)教程

    C#使用Thrift作為RPC框架入門詳細(xì)教程

    這篇文件我們講了從0到1使用thrift框架的方法,也講了一些該框架的基本知識,本文將詳細(xì)介紹 Thrift 在C#語言下的使用方式,并且提供豐富的實(shí)例代碼加以解釋說明,幫助使用者快速構(gòu)建服務(wù),感興趣的朋友一起看看吧
    2021-11-11

最新評論