好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C# 运算符重载

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 的体积: 210
Box2 的体积: 1560
Box3 的体积: 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 的体积: 210
Box2 的体积: 1560
Box3: (18, 20, 15)
Box3 的体积: 5400
Box1 不大于 Box2
Box1 小于 Box2
Box1 不大于等于 Box2
Box1 小于等于 Box2
Box1 不等于 Box2
Box3 等于 Box4

查看更多关于C# 运算符重载的详细内容...

  阅读:37次
第1节:C# 教程    第2节:C# 简介    第3节:C# 环境    第4节:C# 程序结构    第5节:C# 基本语法    第6节:C# 数据类型    第7节:C# 类型转换    第8节:C# 变量    第9节:C# 常量    第10节:C# 运算符    第11节:C# 判断    第12节:C# 循环    第13节:C# 封装    第14节:C# 方法    第15节:C# 可空类型    第16节:C# 数组(Array)    第17节:C# 字符串(String)    第18节:C# 结构体(Struct)    第19节:C# 枚举(Enum)    第20节:C# 类(Class)    第21节:C# 继承    第22节:C# 多态性    第23节:C# 运算符重载    第24节:C# 接口(Interface)    第25节:C# 预处理器指令    第26节:C# 命名空间(Namespace)    第27节:C# 正则表达式    第28节:C# 异常处理    第29节:C# 文件的输入与输出    第30节:C# 特性(Attribute)    第31节:C# 反射(Reflection)    第32节:C# 属性(Property)    第33节:C# 索引器(Indexer)    第34节:C# 委托(Delegate)    第35节:C# 事件(Event)    第36节:C# 集合(Collection)    第37节:C# 泛型(Generic)    第38节:C# 匿名方法    第39节:C# 不安全代码    第40节:C# 多线程    第41节:C# 语言测验