【c#教程】C# 運算子多載

來源:互聯網
上載者:User

C# 運算子多載

您可以重定義或重載 C# 中內建的運算子。因此,程式員也可以使用使用者自訂類型的運算子。重載運算子是具有特殊名稱的函數,是通過關鍵字 operator 後跟運算子的符號來定義的。與其他函數一樣,重載運算子有傳回型別和參數列表。

例如,請看下面的函數:

public static Box operator+ (Box b, Box c){   Box box = new Box();   box.length = b.length + c.length;   box.breadth = b.breadth + c.breadth;   box.height = b.height + c.height;   return box;}

上面的函數為使用者自訂的類 Box 實現了加法運算子(+)。它把兩個 Box 對象的屬性相加,並返回相加後的 Box 對象。

運算子多載的實現

下面的程式示範了完整的實現:

using System;namespace OperatorOvlApplication{   class Box   {      private double length;      // 長度      private double breadth;     // 寬度      private double height;      // 高度      public double getVolume()      {         return length * breadth * height;      }      public void setLength( double len )      {         length = len;      }      public void setBreadth( double bre )      {         breadth = bre;      }      public void setHeight( double hei )      {         height = hei;      }      // 重載 + 運算子來把兩個 Box 對象相加      public static Box operator+ (Box b, Box c)      {         Box box = new Box();         box.length = b.length + c.length;         box.breadth = b.breadth + c.breadth;         box.height = b.height + c.height;         return box;      }   }   class Tester   {      static void Main(string[] args)      {         Box Box1 = new Box();         // 聲明 Box1,類型為 Box         Box Box2 = new Box();         // 聲明 Box2,類型為 Box         Box Box3 = new Box();         // 聲明 Box3,類型為 Box         double volume = 0.0;          // 體積         // Box1 詳述         Box1.setLength(6.0);         Box1.setBreadth(7.0);         Box1.setHeight(5.0);         // Box2 詳述         Box2.setLength(12.0);         Box2.setBreadth(13.0);         Box2.setHeight(10.0);         // Box1 的體積         volume = Box1.getVolume();         Console.WriteLine("Box1 的體積: {0}", volume);         // Box2 的體積         volume = Box2.getVolume();         Console.WriteLine("Box2 的體積: {0}", volume);         // 把兩個對象相加         Box3 = Box1 + Box2;         // Box3 的體積         volume = Box3.getVolume();         Console.WriteLine("Box3 的體積: {0}", volume);         Console.ReadKey();      }   }}

當上面的代碼被編譯和執行時,它會產生下列結果:

Box1 的體積: 210Box2 的體積: 1560Box3 的體積: 5400

可重載和不可重載運算子

下表描述了 C# 中運算子多載的能力:

運算子

描述

+, -, !, ~, ++, -- 這些一元運算子只有一個運算元,且可以被重載。

+, -, *, /, % 這些二元運算子帶有兩個運算元,且可以被重載。

==, !=, <, >, <=, >= 這些比較子可以被重載。

&&, || 這些條件邏輯運算子不能被直接重載。

+=, -=, *=, /=, %= 這些賦值運算子不能被重載。

=, ., ?:, ->, new, is, sizeof, typeof 這些運算子不能被重載。

執行個體

針對上述討論,讓我們擴充上面的執行個體,重載更多的運算子:

using System;namespace OperatorOvlApplication{    class Box    {       private double length;      // 長度       private double breadth;     // 寬度       private double height;      // 高度             public double getVolume()       {         return length * breadth * height;       }      public void setLength( double len )      {          length = len;      }      public void setBreadth( double bre )      {          breadth = bre;      }      public void setHeight( double hei )      {          height = hei;      }      // 重載 + 運算子來把兩個 Box 對象相加      public static Box operator+ (Box b, Box c)      {          Box box = new Box();          box.length = b.length + c.length;          box.breadth = b.breadth + c.breadth;          box.height = b.height + c.height;          return box;      }            public static bool operator == (Box lhs, Box rhs)      {          bool status = false;          if (lhs.length == rhs.length && lhs.height == rhs.height              && lhs.breadth == rhs.breadth)          {              status = true;          }          return status;      }      public static bool operator !=(Box lhs, Box rhs)      {          bool status = false;          if (lhs.length != rhs.length || lhs.height != rhs.height               || lhs.breadth != rhs.breadth)          {              status = true;          }          return status;      }      public static bool operator <(Box lhs, Box rhs)      {          bool status = false;          if (lhs.length < rhs.length && lhs.height               < rhs.height && lhs.breadth < rhs.breadth)          {              status = true;          }          return status;      }      public static bool operator >(Box lhs, Box rhs)      {          bool status = false;          if (lhs.length > rhs.length && lhs.height               > rhs.height && lhs.breadth > rhs.breadth)          {              status = true;          }          return status;      }      public static bool operator <=(Box lhs, Box rhs)      {          bool status = false;          if (lhs.length <= rhs.length && lhs.height               <= rhs.height && lhs.breadth <= rhs.breadth)          {              status = true;          }          return status;      }      public static bool operator >=(Box lhs, Box rhs)      {          bool status = false;          if (lhs.length >= rhs.length && lhs.height              >= rhs.height && lhs.breadth >= rhs.breadth)          {              status = true;          }          return status;      }      public override string ToString()      {          return String.Format("({0}, {1}, {2})", length, breadth, height);      }      }       class Tester   {      static void Main(string[] args)      {        Box Box1 = new Box();          // 聲明 Box1,類型為 Box        Box Box2 = new Box();          // 聲明 Box2,類型為 Box        Box Box3 = new Box();          // 聲明 Box3,類型為 Box        Box Box4 = new Box();        double volume = 0.0;   // 體積        // Box1 詳述        Box1.setLength(6.0);        Box1.setBreadth(7.0);        Box1.setHeight(5.0);        // Box2 詳述        Box2.setLength(12.0);        Box2.setBreadth(13.0);        Box2.setHeight(10.0);       // 使用重載的 ToString() 顯示兩個盒子        Console.WriteLine("Box1: {0}", Box1.ToString());        Console.WriteLine("Box2: {0}", Box2.ToString());                // Box1 的體積        volume = Box1.getVolume();        Console.WriteLine("Box1 的體積: {0}", volume);        // Box2 的體積        volume = Box2.getVolume();        Console.WriteLine("Box2 的體積: {0}", volume);        // 把兩個對象相加        Box3 = Box1 + Box2;        Console.WriteLine("Box3: {0}", Box3.ToString());        // Box3 的體積        volume = Box3.getVolume();        Console.WriteLine("Box3 的體積: {0}", volume);        //comparing the boxes        if (Box1 > Box2)          Console.WriteLine("Box1 大於 Box2");        else          Console.WriteLine("Box1 不大於 Box2");        if (Box1 < Box2)          Console.WriteLine("Box1 小於 Box2");        else          Console.WriteLine("Box1 不小於 Box2");        if (Box1 >= Box2)          Console.WriteLine("Box1 大於等於 Box2");        else          Console.WriteLine("Box1 不大於等於 Box2");        if (Box1 <= Box2)          Console.WriteLine("Box1 小於等於 Box2");        else          Console.WriteLine("Box1 不小於等於 Box2");        if (Box1 != Box2)          Console.WriteLine("Box1 不等於 Box2");        else          Console.WriteLine("Box1 等於 Box2");        Box4 = Box3;        if (Box3 == Box4)          Console.WriteLine("Box3 等於 Box4");        else          Console.WriteLine("Box3 不等於 Box4");        Console.ReadKey();      }    }}

當上面的代碼被編譯和執行時,它會產生下列結果:

Box1: (6, 7, 5)Box2: (12, 13, 10)Box1 的體積: 210Box2 的體積: 1560Box3: (18, 20, 15)Box3 的體積: 5400Box1 不大於 Box2Box1 小於 Box2Box1 不大於等於 Box2Box1 小於等於 Box2Box1 不等於 Box2Box3 等於 Box4

以上就是【c#教程】C# 運算子多載的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.