C# 自定義 implicit和explicit轉換

衣舞晨風發表於2015-06-05
explicit 和 implicit 屬於轉換運算子,如用這兩者可以讓我們自定義的型別支援相互交換
explicti 表示顯式轉換,如從 A -> B 必須進行強制型別轉換(B = (B)A)
implicit 表示隱式轉換,如從 B -> A 只需直接賦值(A = B)

隱式轉換可以讓我們的程式碼看上去更漂亮、更簡潔易懂,所以最好多使用 implicit 運算子。不過!如果物件本身在轉換時會損失一些資訊(如精度),那麼我們只能使用 explicit 運算子,以便在編譯期就能警告客戶呼叫

namespace OperatorTest
{
    /// <summary>
    /// 豬
    /// </summary>
    public class Pig
    {
        public Pig(string name)
        {
            this.Name = name;
        }
        public string Name;

        //explicit 關鍵字用於宣告必須使用強制轉換來呼叫的使用者定義的型別轉換運算子。
        //static explicit operator target_type { source_type identifier }
        //target_type 目標型別
        //source_type 源型別
        //identifier Something
        /*轉換運算子將源型別轉換為目標型別。源型別提供轉換運算子。與隱式轉換不同,必須通過強制轉換的方式來呼叫顯式轉換運算子。如果轉換操作可能導致異常或丟失資訊,則應將其標記為 explicit。這可以防止編譯器無提示地呼叫可能產生無法預見後果的轉換操作*/
        public static implicit operator Pig(Monkey value)
        {
            Pig mk = new Pig(value.Name + ":猴子變豬!!");
            return mk;
        }
    }
namespace OperatorTest
{
    /// <summary>
    /// 猴子
    /// </summary>
    public class Monkey
    {
        public Monkey(string name)
        {
            this.Name = name;
        }
        public string Name;

        //implicit 關鍵字用於宣告隱式的使用者定義型別轉換運算子。
        //static implicit operator target_type { source_type identifier }
        public static explicit operator Monkey(Pig value)
        {
            Monkey mk = new Monkey(value.Name + ":豬變猴子!!");
            return mk;
        }
    }
呼叫:

 Monkey monkey = new Monkey("悟空");
            //隱式轉換 猴子變豬
            Pig monkeyToPig = monkey;
            MessageBox.Show(monkeyToPig.Name);

            Pig pig = new Pig("八戒");
            //顯式轉換 豬變猴子
            Monkey pigToMonkey = (Monkey)pig;
            MessageBox.Show(pigToMonkey.Name);

輸出:



應用:
比如在實際操作中將一個物件A(或者一個實體)序列化成xml進行儲存,那麼可以在該物件A的類中定義一個explicit operator,來實現將符合要求的xml內容轉換為物件或者實體。
當然也可以在物件A的類中定義一個函式來實現這個處理,不過這樣有可能會多出一步,那就是當該函式不是靜態函式時,需要先例項化該物件來呼叫相應的處理函式。


參考:

explicit 關鍵字

implicit 關鍵字

operator 關鍵字


demo下載

相關文章