標籤:
operator
operator 關鍵字用於在類或結構聲明中聲明運算子。運算子聲明可以採用下列四種形式之一:
public static result-type operator unary-operator ( op-type operand )
public static result-type operator binary-operator ( op-type operand, op-type2 operand2 )
public static implicit operator conv-type-out ( conv-type-in operand )
public static explicit operator conv-type-out ( conv-type-in operand )
參數:
- result-type 運算子的結果類型。
- unary-operator 下列運算子之一:+ - ! ~ ++ — true false
- op-type 第一個(或唯一一個)參數的類型。
- operand 第一個(或唯一一個)參數的名稱。
- binary-operator 其中一個:+ - * / % & | ^ << >> == != > < >= <=
- op-type2 第二個參數的類型。
- operand2 第二個參數的名稱。
- conv-type-out 類型轉換運算子的目標類型。
- conv-type-in 類型轉換運算子的輸入類型。
注意:
- 前兩種形式聲明了使用者定義的重載內建運算子的運算子。並非所有內建運算子都可以被重載(請參見可重載的運算子)。op-type 和 op-type2 中至少有一個必須是封閉類型(即運算子所屬的類型,或理解為自訂的類型)。例如,這將防止重定義整數加法運算子。
- 後兩種形式聲明了轉換運算子。conv-type-in 和 conv-type-out 中正好有一個必須是封閉類型(即,轉換運算子只能從它的封閉類型轉換為其他某個類型,或從其他某個類型轉換為它的封閉類型)。
- 運算子只能採用值參數,不能採用 ref 或 out 參數。
- C# 要求成對重載比較子。如果重載了==,則也必須重載!=,否則產生編譯錯誤。同時,比較子必須返回bool類型的值,這是與其他算術運算子的根本區別。
- C# 不允許重載=運算子,但如果重載例如+運算子,編譯器會自動使用+運算子的重載來執行+=運算子的操作。
- 運算子多載的其實就是函數重載。首先通過指定的運算運算式調用對應的運算子函數,然後再將運算對象轉化為運算子函數的實參,接著根據實參的類型來確定需要調用的函數的重載,這個過程是由編譯器完成。
- 任何運算子聲明的前面都可以有一個可選的屬性(C# 編程指南)列表。
explicit
explicit 關鍵字用於聲明必須使用強制轉換來調用的使用者定義的類型轉換運算子。
static explicit operator target_type { source_type identifier }
參數:
- target_type 目標類型
- source_type 源類型。
- identifier Something。
注意:
- 轉換運算子將源類型轉換為目標類型。源類型提供轉換運算子。與隱式轉換不同,必須通過強制轉換的方式來調用顯式轉換運算子。如果轉換操作可能導致異常或丟失資訊,則應將其標記為 explicit。這可以防止編譯器無提示地調用可能產生無法預見後果的轉換操作。
implicit
implicit 關鍵字用於聲明隱式的使用者定義型別轉換運算子。
static implicit operator target_type { source_type identifier }
注意:
- 隱式轉換可以通過消除不必要的類型轉換來提高原始碼的可讀性。但是,因為可以在程式員未指定的情況下發生隱式轉換,因此必須注意防止令人不愉快的後果。一般情況下,隱式轉換運算子應當從不引發異常並且從不丟失資訊,以便可以在程式員不知曉的情況下安全使用它們。如果轉換運算子不能滿足那些條件,則應將其標記為 explicit。
樣本:
以下是一個綜合樣本,簡要展示用法。如要更具體細節的瞭解,請參閱MSDN Library。
// keywords_operator.cs
/*
控制台輸出:
r3 = ¥48元6角6分
float f = 48.66
r4 = ¥48元6角5分
*/
我們會發現r4結果少了一分錢!這是因為在:
uint fen = (uint)(((f - yuan) * 100) % 10);
這句中,在將float轉換為uint時發生了圓整錯誤(這與電腦以二進位儲存有關)。解決這個錯誤,我們可以使用System.Convert類中用於處理數位靜態方法:
uint fen = Convert.ToUInt32(((f - yuan) * 100) % 10);
不過使用System.Convert處理會有些效能的損失。
C# 參考之轉換關鍵字:operator、explicit與implicit