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下載
以上就是C# 自訂 implicit和explicit轉換的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!