C#中自定義類型轉換


類型轉換有兩種,隱式轉換和顯示轉換,當沒有數據丟失的時候,隱式轉換會自動進行。C#允許用戶定義自己的數據類型(結構和類),那么在他們之間的類型轉換需要用戶自己定義。

C#中基本類型轉換點擊打開鏈接

1、類型轉換定義:public  static  implicit / explicit  operator  type1(type2   para){ return  }

注意:

(1)、與運算符重載類似,使用 public 和 static ,表示與類相關的公有操作,使用 operator 關鍵字;

(2)、implicit 表示隱式轉換,explicit 表示顯示轉換,遵循的原則與預定義的類型轉換一致,當沒有數據丟失的時候使用 implicit ,否則使用 explicit ;

(3)、type1 表示 目標類型,type2 表示 源類型,需要用 return 返回 type1 類型對象。

下面給出自定義類與值類型的轉換定義:

// 自定義的一個類
public class MyClass1
{
    // uint 類型字段 a
    public uint a;
    // int 類型字段 b
    public int b;
    // 自定義構造函數
    public MyClass1(uint a,int b)
    {
        this.a = a;
        this.b = b;
    }
    // 自定義的顯示轉換:將 MyClass1 類型的對象轉換成 int 類型
    public static explicit operator int(MyClass1 obj)
    {
        // 實際上是將 字段 a 的值通過基本類型的強制轉換,變成 int 類型的返回值
        return (int)obj.a;
    } 
    // 自定義的隱式轉換: 將 MyClass1 類型的對象轉換成 float 類型
    public static implicit operator float(MyClass1 obj)
    {   // 實際上是將 字段 b 的值轉換成float,因為 int 轉 float 是隱式的,所以定義的時候可以定義為 implicit
        return obj.b;
    } 
}

下面給出調用示例:
// 聲明並初始化 MyClass1 類的對象
MyClass1  myClass = new MyClass1(1,11);
// 調用自定義的顯示轉換
int a = (int)myClass; // a = 1
// 調用自定義的隱式轉換 
float b = myClass; // b = 11

 

2、類之間自定義類型轉換

當兩個類之間沒有派生關系時(有派生關系時,轉換已經存在),可以在源類型或者是派生類型中定義類型轉換。

注意:

(1)、兩個類之間沒有派生關系時才可以自定義類型轉換;

(2)、類型轉換在源類型或目標類型中定義,可以分開定義,但是兩個類中不能定義相同的類型轉換。

下面給出示例:

    // 自定義的類 MyClassA
    public class MyClassA
    {
        public int id { get; set; }
        public string name { get; set; }


        // 定義的顯示類型轉換,返回一個 MyClassB 類型的對象
        // 如果 MyClassB 中沒有這個與這個相同的轉換,這里可以給出
        public static explicit operator MyClassB(MyClassA obj)
        {
            return new MyClassB() { id = obj.id, text = obj.name };
        }
    }

    // 自定義的類 MyClassB
    public class MyClassB
    {
        public int id { get; set; }
        public string text { get; set; }

        // 定義的顯示類型轉換,返回一個 MyClassA 類型的對象    
        public static explicit operator MyClassA(MyClassB obj)
        {
            return new MyClassA();
        }

        // 定義的顯示類型轉換,返回一個 MyClassB 類型的對象
        //public static explicit operator MyClassB(MyClassA obj)
        //{
        //    return new MyClassB() { id = obj.id, text = obj.name };
        //}
    }

下面是調用示例:

        static void Main(string[] args)
        {
            // 聲明並初始化一個 MyClassA 類對象
            MyClassA ca = new MyClassA { id = 11, name = "jack" };
            MyClassB cb = (MyClassB)ca;

            // 聲明並初始化一個 MyClassB 類對象
            MyClassB myClassB = new MyClassB();
            // 使用 強制類型轉換
            MyClassA myClassA = (MyClassA)myClassB;
            MyClassB myClassB1 = (MyClassB)myClassA;

        }

 

3、基類和派生類之間的類型轉換

 

注意:派生類可以隱式轉換成基類。基類轉換成派生類時,只有基類引用指向該派生類對象時可以轉換成功,其他的會拋出異常。

下面給出示例:

 

    // 基類
    public class MyBase
    {

    }
    public class MySub1 : MyBase
    {

    }
    public class MySub2 : MyBase
    {

    }

下面是調用示例:

        static void Main(string[] args)
        {
            // 基類的引用指向基類的對象
            MyBase myBase = new MyBase();
            // MySub1 類型的對象隱式轉換成了 MyBase 類型,成功
            MyBase myBase1 = new MySub1();
            // MySub2 類型的對象隱式轉換成了 MyBase 類型,成功
            MyBase myBase2 = new MySub2();
            // 可以執行,成功
            MySub1 mySubA1 = (MySub1)myBase1;
            // 因為 MyBase 引用的是本類的對象,執行的時候會拋出異常,失敗
            MySub1 mySubA = (MySub1)myBase;
            // 因為 MyBase 引用的是 MySub2 類型的對象,執行的時候會拋出異常,失敗
            MySub1 mySubA2 = (MySub1)myBase2;
        }

 

 

出處:https://blog.csdn.net/cloproad/article/details/79101275


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM