对象的比较与排序(五):C#运算符重载
我們可以使用他來實現這樣的需求:
當一個訂單與另外一個訂單相加形成一個新的訂單。新訂單的貨物為兩個訂單的貨物的并集,總價為兩個訂單的總價和。
下面實現看看
先做個輔助的貨物類 public?class?Merchandise
{
????public?int?Count?{?get;?set;?}
????public?string?Name?{?get;?set;?}
????public?double?UnitPrice?{?get;?set;?}
} 然后來實現訂單類 public?class?Order
{
????public?double?TotalPrices?{?get;?set;?}
????public?List<Merchandise>?Merchadises?{?get;?set;?}
????public?static?Order?operator?+(Order?a,?Order?b)
????{
????????Order?newOrder?=?new?Order()
????????{
????????????TotalPrices?=?a.TotalPrices?+?b.TotalPrices
????????};
????????newOrder.Merchadises.AddRange(a.Merchadises);
????????newOrder.Merchadises.AddRange(b.Merchadises);
????????return?newOrder;
????}
}
下面是客戶端調用代碼
? ????????Order?o1?=?new?Order?{?TotalPrices?=?500.0?};
????????o1.Merchadises.AddRange(
????????????new?List<Merchandise>
????????????{
????????????????new?Merchandise{Name?=?"肥皂",Count=100,UnitPrice=3},
????????????????new?Merchandise{Name?=?"毛巾",Count=100,UnitPrice=2}
????????????}
????????);
????????Order?o2?=?new?Order?{?TotalPrices?=?8000.0?};
????????o1.Merchadises.AddRange(
????????????new?List<Merchandise>
????????????{
????????????????new?Merchandise{Name?=?"電視",Count=5,UnitPrice=1000},
????????????????new?Merchandise{Name?=?"DVD",Count=5,UnitPrice=600}
????????????}
????????);
????????Order?o3?=?o1?+?o2;
可以看出,運算符重載看起來與標準靜態方法聲明類似,但它們使用關鍵字operator 和 運算符本身,而不是一個方法名。現在可以成功地使用 + 運算符和這個類。
注意:
1.要重載運算符,可給類添加運算符類型成員(它們必須是static)。
2.一些運算符有多種用途,(如 - 運算符就有一元和二元兩種功能),因此我們還指定了要處理多少個操作數,以及這些操作數的類型。
3.一般情況下,操作數的類型與定義運算符的類相同,但也可以處理混合 類型的運算符。
貼上MSDN的說明
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運算符的結果類型。
下列運算符之一:+???-???!???~???++???—???true???false
第一個(或唯一一個)參數的類型。
第一個(或唯一一個)參數的名稱。
其中一個:+???-???*???/???%???&???|???^???<<???>>???==???!=???>???<???>=???<=
第二個參數的類型。
第二個參數的名稱。
類型轉換運算符的目標類型。
類型轉換運算符的輸入類型。
備注
前兩種形式聲明了用戶定義的重載內置運算符的運算符。注意,并非所有內置運算符都可以被重載(請參見可重載的運算符)。op-type 和 op-type2 中至少有一個必須是封閉類型(即運算符所屬的類型)。例如,這將防止重定義整數加法運算符。
后兩種形式聲明了轉換運算符。conv-type-in 和 conv-type-out 中正好有一個必須是封閉類型(即,轉換運算符只能從它的封閉類型轉換為其他某個類型,或從其他某個類型轉換為它的封閉類型)。
運算符只能采用值參數,不能采用 ref 或 out 參數。
任何運算符聲明的前面都可以有一個可選的屬性(C# 編程指南)列表。
?
總結
以上是生活随笔為你收集整理的对象的比较与排序(五):C#运算符重载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: x264编码参数大测试:10 trell
- 下一篇: mysql 同机做主从