對象的比較與排序(五):C#運算子多載

來源:互聯網
上載者:User
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

運算子的結果類型。

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# 編程指南)列表。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.