日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C#使用is、as關鍵字以及顯式強轉實現引用類型轉換_C#教程

作者:Darren?Ji ? 更新時間: 2022-10-02 編程語言

在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

欄目分類
最近更新