C# 運算子多載

來源:互聯網
上載者:User
您可以重定義或重載 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;      // 長度      privatedouble 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 的體積: 210 Box2 的體積: 1560 Box3 的體積: 5400

可重載和不可重載運算子

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

運算子 描述
+, -, !, ~, ++, -- 這些一元運算子只有一個運算元,且可以被重載。
+, -, *, /, % 這些二元運算子帶有兩個運算元,且可以被重載。
==, !=, <, >, <=, >= 這些比較子可以被重載
&&, || 這些條件邏輯運算子不能被直接重載。
+=, -=, *=, /=, %= 這些賦值運算子不能被重載。
=, ., ?:, ->, new, is, sizeof, typeof 這些運算子不能被重載。

執行個體

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

using System;namespace OperatorOvlApplication{   class Box    {       private double length;      // 長度       privatedouble 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 = newBox();          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()      {            returnString.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 的體積: 210 Box2 的體積: 1560 Box3: (18, 20, 15) Box3 的體積: 5400 Box1 不大於 Box2 Box1 小於 Box2 Box1 不大於等於 Box2 Box1 小於等於 Box2 Box1 不等於 Box2 Box3 等於 Box4

以上就是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.