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