C# 參考之轉換關鍵字:operator、explicit與implicit

operator

operator 關鍵字用於在類或結構聲明中聲明運算符。運算符聲明能夠採用下列四種形式之一:html

  1. public static result-type operator unary-operator ( op-type operand )
  2. public static result-type operator binary-operator (
        op-type operand,
        op-type2 operand2
        )
  3. public static implicit operator conv-type-out ( conv-type-in operand )
  4. public static explicit operator conv-type-out ( conv-type-in operand )

參數程序員

  1. result-type 運算符的結果類型。
  2. unary-operator 下列運算符之一:+ - ! ~ ++ — true false
  3. op-type 第一個(或惟一一個)參數的類型。
  4. operand 第一個(或惟一一個)參數的名稱。
  5. binary-operator 其中一個:+ - * / % & | ^ << >> == != > < >= <=
  6. op-type2 第二個參數的類型。
  7. operand2 第二個參數的名稱。
  8. conv-type-out 類型轉換運算符的目標類型。
  9. conv-type-in 類型轉換運算符的輸入類型。

注意編程

  1. 前兩種形式聲明瞭用戶定義的重載內置運算符的運算符。並不是全部內置運算符均可以被重載(請參見可重載的運算符)。op-type 和 op-type2 中至少有一個必須是封閉類型(即運算符所屬的類型,或理解爲自定義的類型)。例如,這將防止重定義整數加法運算符。
  2. 後兩種形式聲明瞭轉換運算符。conv-type-in 和 conv-type-out 中正好有一個必須是封閉類型(即,轉換運算符只能從它的封閉類型轉換爲其餘某個類型,或從其餘某個類型轉換爲它的封閉類型)。
  3. 運算符只能採用值參數,不能採用 ref 或 out 參數。
  4. C# 要求成對重載比較運算符。若是重載了==,則也必須重載!=,不然產生編譯錯誤。同時,比較運算符必須返回bool類型的值,這是與其餘算術運算符的根本區別。
  5. C# 不容許重載=運算符,但若是重載例如+運算符,編譯器會自動使用+運算符的重載來執行+=運算符的操做。
  6. 運算符重載的其實就是函數重載。首先經過指定的運算表達式調用對應的運算符函數,而後再將運算對象轉化爲運算符函數的實參,接着根據實參的類型來肯定須要調用的函數的重載,這個過程是由編譯器完成。
  7. 任何運算符聲明的前面均可以有一個可選的屬性(C# 編程指南)列表。

explicit

explicit 關鍵字用於聲明必須使用強制轉換來調用的用戶定義的類型轉換運算符。安全

static explicit operator target_type { source_type identifier }

參數ide

  1. target_type 目標類型
  2. source_type 源類型。
  3. identifier Something。

注意函數

  1. 轉換運算符將源類型轉換爲目標類型。源類型提供轉換運算符。與隱式轉換不一樣,必須經過強制轉換的方式來調用顯式轉換運算符。若是轉換操做可能致使異常或丟失信息,則應將其標記爲 explicit。這能夠防止編譯器無提示地調用可能產生沒法預見後果的轉換操做。

implicit

implicit 關鍵字用於聲明隱式的用戶定義類型轉換運算符。性能

static implicit operator target_type { source_type identifier }
注意
  1. 隱式轉換能夠經過消除沒必要要的類型轉換來提升源代碼的可讀性。可是,由於能夠在程序員未指定的狀況下發生隱式轉換,所以必須注意防止使人不愉快的後果。通常狀況下,隱式轉換運算符應當從不引起異常而且從不丟失信息,以即可以在程序員不知曉的狀況下安全使用它們。若是轉換運算符不能知足那些條件,則應將其標記爲 explicit。

示例ui

如下是一個綜合示例,簡要展現用法。如要更具體細節的瞭解,請參閱MSDN Library。spa

// keywords_operator.cs
/*
控制檯輸出:
r3 = ¥48元6角6分
float f = 48.66
r4 = ¥48元6角5分
*/

咱們會發現r4結果少了一分錢!這是由於在:htm

uint fen = (uint)(((f - yuan) * 100) % 10);

這句中,在將float轉換爲uint時發生了圓整錯誤(這與計算機以二進制存儲有關)。解決這個錯誤,咱們可使用System.Convert類中用於處理數字的靜態方法:

uint fen = Convert.ToUInt32(((f - yuan) * 100) % 10);

不過使用System.Convert處理會有些性能的損失。

相關文章
相關標籤/搜索