C# 自定義 implicit和explicit轉換
explicit 和 implicit 屬於轉換運算子,如用這兩者可以讓我們自定義的型別支援相互交換
explicti 表示顯式轉換,如從 A -> B 必須進行強制型別轉換(B = (B)A)
implicit 表示隱式轉換,如從 B -> A 只需直接賦值(A = B)
輸出:
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的類中定義一個函式來實現這個處理,不過這樣有可能會多出一步,那就是當該函式不是靜態函式時,需要先例項化該物件來呼叫相應的處理函式。
參考:
相關文章
- c#自定義型別的轉換方式operator,以及implicit(隱式)和explicit (顯示)宣告C#型別
- C# explicit與implicitC#
- C#中的explicit和implicit瞭解一下吧C#
- C# 顯式轉換關鍵字 explicitC#
- C#自定義控制元件—轉換開關C#控制元件
- 自定義值轉換器
- C# 自定義事件和委託(精彩轉載)C#事件
- [Warning] TIMESTAMP with implicit DEFAULT --explicit_defaults_for_timestamp
- C#:委託和自定義事件C#事件
- Django(6)自定義路由轉換器Django路由
- [Warning] TIMESTAMP with implicit DEFAULT value is deprecated.explicit_defaults_for_timestamp
- MyBatis使用自定義TypeHandler轉換型別MyBatis型別
- JavaRetrofit2使用–自定義轉換器Java
- Native Query的自定義轉換器
- PostgreSQL自定義自動型別轉換(CAST)SQL型別AST
- C#自定義控制元件—旋轉按鈕C#控制元件
- C#使用自定義特性C#
- 可空型別(Nullable<T>)及其引出的關於explicit、implicit的使用型別Null
- Mybatis使用小技巧-自定義型別轉換器MyBatis型別
- Spring Boot之自定義JSON轉換器Spring BootJSON
- springmvc 自定義訊息轉換器完整例子SpringMVC
- C#全形和半形轉換C#
- C#建立自定義配置節C#
- 棧(Stack) --- C# 自定義和微軟官方的區別C#微軟
- Operator運算子過載與Implicit隱式型別轉換型別
- c#換行符及空格符(轉義字元)C#字元
- 自定義Push/Pop和Present/Dismiss轉場
- 自定義present和dismiss的轉場動畫動畫
- C# 列舉遍歷和轉換C#
- C#中自定義異常類C#
- 自定義Navigator切換fragmentFragment
- QT自定義精美換膚介面QT
- C# 將Excel轉為PDF時自定義表格紙張大小C#Excel
- C# bytes[]和sting互相轉換C#
- 08.Django自定義模板,自定義標籤和自定義過濾器Django過濾器
- 轉載:在c#中使用sqlite的3種自定義函式C#SQLite函式
- C#自定義FileUpload控制元件C#控制元件
- C#自定義控制元件—指示燈C#控制元件