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

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

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

在C#中,當(dāng)引用類(lèi)型需要轉(zhuǎn)換的時(shí)候,經(jīng)常會(huì)用到關(guān)鍵字is、as以及顯式強(qiáng)轉(zhuǎn)。本篇來(lái)體驗(yàn)這三者的用法。

先來(lái)梳理.NET引用類(lèi)型轉(zhuǎn)換的"約定俗成",或者叫"慣例":

  • 子類(lèi)可以隱式轉(zhuǎn)換為父類(lèi)/基類(lèi),也就是"里氏替換原則"所說(shuō)的:子類(lèi)必須能夠替換其父類(lèi)/基類(lèi)。
  • 父類(lèi)/基類(lèi)轉(zhuǎn)換為子類(lèi)時(shí),必須進(jìn)行顯式類(lèi)型強(qiáng)轉(zhuǎn)。

子類(lèi)轉(zhuǎn)換成父類(lèi)

    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)了子類(lèi)轉(zhuǎn)換成父類(lèi),從中可以看出:子類(lèi)Dog確實(shí)能替換父類(lèi)Animal,換句話(huà)說(shuō),子類(lèi)就是父類(lèi),子類(lèi)的實(shí)例可以賦值給父類(lèi)的變量,不需要as,不需要強(qiáng)轉(zhuǎn),一切都是隱式發(fā)生,很好地體現(xiàn)了"里氏替換原則"。

父類(lèi)轉(zhuǎn)換為子類(lèi),父類(lèi)變量通過(guò)子類(lèi)賦值而創(chuàng)建

父類(lèi)as成子類(lèi):

Animal animal = new Dog(){Name = "Dog",Age = 1};
Dog dog = animal as Dog;
Console.WriteLine(dog.Name + " " + dog.Age);
Console.ReadKey();

輸出結(jié)果:Dog 1

父類(lèi)顯式強(qiáng)轉(zhuǎn)成子類(lèi)

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),父類(lèi)都可以轉(zhuǎn)換成子類(lèi),但是有前提的:把子類(lèi)實(shí)例賦值給父類(lèi)變量。  

父類(lèi)轉(zhuǎn)換為子類(lèi),父類(lèi)變量通過(guò)自身構(gòu)造函數(shù)而創(chuàng)建

父類(lèi)as成子類(lèi)失?。?/p>

Animal animal = new Animal(){Name = "Sheep"};
Dog dog = animal as Dog;
Console.WriteLine(dog.Name + " " + dog.Age);
Console.ReadKey();

輸出結(jié)果:報(bào)"NullReferenceException"錯(cuò)

可見(jiàn),當(dāng)父類(lèi)變量通過(guò)自身構(gòu)造函數(shù)而創(chuàng)建時(shí),無(wú)法將父類(lèi)轉(zhuǎn)換成子類(lèi)。

(1)為了避免as的時(shí)候報(bào)"NullReferenceException"錯(cuò),引入關(guān)鍵is做類(lèi)型判斷:

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做類(lèi)型轉(zhuǎn)換的時(shí)候,如果轉(zhuǎn)換失敗,返回null。根據(jù)這點(diǎn),也可以通過(guò)判斷as轉(zhuǎn)換后的返回值是否為null,來(lái)避免報(bào)錯(cuò):

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   

父類(lèi)顯式強(qiáng)轉(zhuǎn)成子類(lèi)失敗

Animal animal = new Animal(){Name = "Sheep"};
Dog dog = (Dog) animal;
Console.WriteLine(dog.Name + " " + dog.Age);
Console.ReadKey();

輸出結(jié)果:報(bào)"InvalidCastException"錯(cuò)

可見(jiàn),當(dāng)父類(lèi)變量通過(guò)自身構(gòu)造函數(shù)而創(chuàng)建時(shí),無(wú)法將父類(lèi)轉(zhuǎn)換成子類(lèi)。

為了避免顯示強(qiáng)轉(zhuǎn)時(shí)報(bào)"InvalidCastException"錯(cuò),引入關(guān)鍵字is做類(lèi)型判斷:

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é)

  • 對(duì)于引用類(lèi)型的轉(zhuǎn)換,應(yīng)該考慮使用顯式強(qiáng)轉(zhuǎn)或as。兩者的區(qū)別在于:一旦類(lèi)型無(wú)法轉(zhuǎn)換,使用顯式強(qiáng)轉(zhuǎn)會(huì)報(bào)錯(cuò),而使用as會(huì)返回null。
  • 為了避免顯式強(qiáng)轉(zhuǎn)或as所引發(fā)的報(bào)錯(cuò),應(yīng)該考慮使用is來(lái)判斷類(lèi)型間是否能轉(zhuǎn)換。
  • 使用as進(jìn)行引用類(lèi)型轉(zhuǎn)換,不僅可以用is來(lái)判斷類(lèi)型間是否能轉(zhuǎn)換,還可以通過(guò)判斷as后的返回值是否為null,然后采取相應(yīng)的操作。
  • 對(duì)于基本類(lèi)型的轉(zhuǎn)換:使用Convert, Parse, TryParse等。

is用于判斷類(lèi)型是否一致,as和顯式強(qiáng)轉(zhuǎn)用于類(lèi)型的轉(zhuǎn)換。

到此這篇關(guān)于C#實(shí)現(xiàn)引用類(lèi)型轉(zhuǎn)換的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

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

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

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

    C#實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器功能完整實(shí)例

    這篇文章主要介紹了C#實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器功能,結(jié)合完整實(shí)例形式分析了C#實(shí)現(xiàn)常見(jiàn)的數(shù)學(xué)運(yùn)算、進(jìn)制轉(zhuǎn)換等相關(guān)操作技巧與界面布局方法,需要的朋友可以參考下
    2017-08-08
  • C#中派生類(lèi)調(diào)用基類(lèi)構(gòu)造函數(shù)用法分析

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評(píng)論