6.14 运算符重载

前面讲的运算符都有一个共同点,即它们只能使用框架预定义类型作为操作数,如果想要对自定义类型进行操作该怎么办呢?和C++一样,C#同样支持运算符重载,以处理此类问题。例如,可以创建一个名为ComplexNumber的新数据类型来表示一个复杂的数字,并提供使用标准算术运算符对此类数字执行数学运算的方法,如使用加(+)运算符将两个复杂数字相加。

可见,使用运算符重载给开发人员带来了如下好处:

❑使代码更加容易理解和阅读;

❑可以利用现有运算符的优先级关系规则处理对象之间的运算;

❑使代码更加灵活,对象可操作性更好。

下面将详细阐述如何实现运算符重载。

6.14.1 运算符的重载

运算符重载只能应用于类或结构。要重载一个运算符,可以声明一个名为operator x的方法并实现它,如operator+和operator-,一元运算符和二元运算符都可以被重载,相应地,重载方法分别带一个或两个参数(类或结构类型),其语法为:


//一元运算符重载

public static自定义类型operator要重载的运算符(类型)

//二元运算符重载

public static自定义类型operator要重载的运算符(类型1,类型2)


如:public static OperatorSample operator+(OperatorSample obj)。

需要注意的是,所有运算符重载均为类的静态方法,且必须使用public进行修饰。

注意 重载相等运算符(==)时,还必须重载不相等运算符(!=)。<和>运算符以及<=和>=运算符也必须成对重载。

下面是一个运算符重载的示例,如代码清单6-10所示。我们为OperatorSample类重载了加(+)运算符,实现了可以使用加运算符来实现两个OperatorSample对象的相加功能,可见运算符重载很大程度上提高了编程的便利性。通过重载运算符,可以使用更熟悉或更自然的方式来操作两个自定义对象。

下面是一个示例,如代码清单6-10所示。

代码清单6-10 运算符重载示例


1 using System;

2 using System.Reflection;

3

4 namespace ProgrammingCSharp4

5{

6 class OperatorSample

7{

8 public int Value{get;set;}

9

10 static void Main()

11{

12 OperatorSample o1=new OperatorSample();

13 o1.Value=10;

14

15 OperatorSample o2=new OperatorSample();

16 o2.Value=20;

17

18 OperatorSample o3=o1+o2;

19 Console.WriteLine(o3.Value);

20}

21

22 public static OperatorSample operator+(OperatorSample o1,OperatorSample o2)

23{

24 OperatorSample o=new OperatorSample();

25 o.Value=o1.Value+o2.Value;

26 return o;

27}

28}

29}


上述代码的运行结果如下:


30