.net转换关键字:operator、explicit与implicit
operator、explicit與implicit 很少用到,但也不能不知道,發現這篇寫很好,轉一篇
operator
operator 關鍵字用于在類或結構聲明中聲明運算符。運算符聲明可以采用下列四種形式之一:
1.???????????? public static result-type operator unary-operator ( op-type operand )
2.???????????? public static result-type operator binary-operator (
3.???????????????? op-type operand,
4.???????????????? op-type2 operand2
5.???????????????? )
6.???????????? public static implicit operator conv-type-out ( conv-type-in operand )
7.???????????? 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 implicit operator target_type { source_type identifier }
參數:
1.???????? target_type 目標類型
2.???????? source_type 源類型。
3.???????? identifier Something。
注意:
1.???????? 轉換運算符將源類型轉換為目標類型。源類型提供轉換運算符。與隱式轉換不同,必須通過強制轉換的方式來調用顯式轉換運算符。如果轉換操作可能導致異常或丟失信息,則應將其標記為 explicit。這可以防止編譯器無提示地調用可能產生無法預見后果的轉換操作。
implicit
implicit 關鍵字用于聲明隱式的用戶定義類型轉換運算符。
static implicit operator target_type { source_type identifier }
注意:
1.???????? 隱式轉換可以通過消除不必要的類型轉換來提高源代碼的可讀性。但是,因為可以在程序員未指定的情況下發生隱式轉換,因此必須注意防止令人不愉快的后果。一般情況下,隱式轉換運算符應當從不引發異常并且從不丟失信息,以便可以在程序員不知曉的情況下安全使用它們。如果轉換運算符不能滿足那些條件,則應將其標記為 explicit。
示例:
以下是一個綜合示例,簡要展示用法。如要更具體細節的了解,請參閱MSDN Library。
// keywords_operator.cs
// keywords_operator.cs
using System;
namespace Hunts.Keywords
{
??? // 定義一個人民幣結構。數據類型轉換的語法對于結構和類是一樣的
??? public struct RMB
???? {
??????? // 注意:這些數的范圍可能不能滿足實際中的使用
??????? public uint Yuan;
??????? public uint Jiao;
??????? public uint Fen;
??????? public RMB(uint yuan, uint jiao, uint fen)
???????? {
??????????? if (fen > 9)
???????????? {
??????????????? jiao += fen / 10;
??????????????? fen = fen % 10;
??????????? }
??????????? if (jiao > 9)
???????????? {
??????????????? yuan += jiao / 10;
??????????????? jiao = jiao % 10;
??????????? }
??????????? this.Yuan = yuan;
??????????? this.Jiao = jiao;
??????????? this.Fen = fen;
??????? }
??????? public override string ToString()
???????? {
??????????? return string.Format("¥{0}元{1}角{2}分", Yuan, Jiao, Fen);
??????? }
??????? // 一些操作
??????? public static RMB operator +(RMB rmb1, RMB rmb2)
???????? {
??????????? return new RMB(rmb1.Yuan + rmb2.Yuan, rmb1.Jiao + rmb2.Jiao, rmb1.Fen + rmb2.Fen);
??????? }
??????? public static implicit operator float(RMB rmb)
???????? {
??????????? return rmb.Yuan + (rmb.Jiao/10.0f) + (rmb.Fen/100.00f);
??????? }
??????? public static explicit operator RMB(float f)
???????? {
??????????? uint yuan = (uint)f;
??????????? uint jiao = (uint)((f - yuan) * 10);
??????????? uint fen = (uint)(((f - yuan) * 100) % 10);
??????????? return new RMB(yuan, jiao, fen);
??????? }
??????? // more
??? }
??? class App
???? {
??????? static void Main()
???????? {
??????????? RMB r1, r2, r3, r4;
??????????? // 記得小學時的某次捐款,我把口袋里藏好的一塊錢加6張一毛錢以及13個一分錢的硬幣都貢獻出去了:(
??????????? r1 = new RMB(1, 6, 13);
??????????? // 其實當時其他人都已經交過了,他們總共交了:
??????????? r2 = new RMB(46, 9, 3);
??????????? // 那么加上我的就是:
??????????? r3 = r1 + r2;
??????????? Console.WriteLine("r3 = {0}", r3.ToString());
??????????? // 隱式轉換
??????????? float f = r3;
??????????? Console.WriteLine("float f= {0}", f);
??????????? // 顯式轉換
??????????? r4 = (RMB)f;
??????????? Console.WriteLine("r4 = {0}", r4.ToString());
??????????? //如果不進行顯示轉換,將出現錯誤 CS0266: 無法將類型“float”隱式轉換為“Hunts.Keywords.RMB”。存在一個顯式轉換(是否缺少強制轉換?)
??????????? Console.Read();
??????? }
??? }
}
/*
控制臺輸出:
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處理會有些性能的損失。
引自:http://hi.baidu.com/zeratul_bb/blog/item/b4beb62646ab48108a82a113.html
?
總結
以上是生活随笔為你收集整理的.net转换关键字:operator、explicit与implicit的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编码规范_总结
- 下一篇: overload和override的区别