您可以重定义或重载 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" ) ;
Console . WriteLine ( "Box1 不大于 Box2" ) ;
if ( Box1 < Box2 )
Console . WriteLine ( "Box1 小于 Box2" ) ;
Console . WriteLine ( "Box1 不小于 Box2" ) ;
if ( Box1 >= Box2 )
Console . WriteLine ( "Box1 大于等于 Box2" ) ;
Console . WriteLine ( "Box1 不大于等于 Box2" ) ;
if ( Box1 <= Box2 )
Console . WriteLine ( "Box1 小于等于 Box2" ) ;
Console . WriteLine ( "Box1 不小于等于 Box2" ) ;
if ( Box1 != Box2 )
Console . WriteLine ( "Box1 不等于 Box2" ) ;
Console . WriteLine ( "Box1 等于 Box2" ) ;
Box4 = Box3 ;
if ( Box3 == Box4 )
Console . WriteLine ( "Box3 等于 Box4" ) ;
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
  • #0
  •