介绍 C# 中的运算符重载

 介绍 C# 中的运算符重载
周融,2007 年 5 月
(C) 2001-2007 保留所有权利。

重载是面向对象中的一个重要概念,它是对象多态性的一种不完全体现,人们通常所说的重载,往往指的是函数的重载。本文向读者介绍一种新的重载模型——运算符重载。

在本文中的内容:
1、为什么需要运算符重载
2、C# 运算符重载决策示例
3、C# 运算符重载一览表
4、结论

为什么需要运算符重载

函数的重载为一个对象上的相同行为提供不同的参数方式,这样,开发人员便可以使用这些不同的参数实现类似的功能。一组函数重载决策一般实现的功能是相同的,例如对 Object 对象上的 ToString() 方法就有几个重载版本,虽然它们接受的参数不同,但却都表达同一个行为的最终结果。参数的不同导致函数重载版本的签名不同,这样编译器很容易知道需要调用那一个重载版本。这种技术给开发人员带来了方便。

现在我们试图对重载的定义进行推广。先让我们看看最简单的例子,我们通常需要像这样声明并初始化一个值类型的变量:

int  digit  =   5 ;
string  sayHello  =   " Hello, World " ;

这里的“=”运算符,就是将右边的值传递给左边变量的赋值运算符。这里,5 的类型为 int,“Hello, World”的类型为 string,这与左边被赋值的变量类型完全一致。

但对于上述的解释,我们还可以这样认为:5 的类型为 uint 或 byte,"Hello, World"的类型为 char[],那么如此一来,赋值运算左边和右边的类型就不在等同,那么编译器如何处理呢?有人会说,这就是“隐式类型转换”,这个答案确实很好,但隐式类型转换的规则已经被编译器确定,如果赋值运算的两端不遵循隐式类型转换规则,则需要显式类型转换,例如:

char  c  =   ' 2 ' ;
string  s  =  ( string )c;
int  i  =  ( int )c;

这些显式类型转换并不适用于任何场合,也许人们希望在其自定义的类中也能用赋值、加减乘除等语法操作它们。

对象和对象之间是可能存在这种特殊的运算关系的,一个典型的例子就是“复数”对象。复数是一个值类型对象,它包含两个 double 类型的域,两个复数对象可以被加、减、乘、除和相等性判断,但无法比较大小。我们试想可以如此操作复数类:

Complex c1, c2;
c1 
=   new  Complex( 3 4 );
c2 
=   " 4+5i " ;
var c3 
=  c1  *  c2  /   - c1  +  c2;
if  (c1  ==  c2) c3  =  c1;  else  c3  =  c2;

我们可以从这些代码可以预见运算符重载所需要实现的功能:
1、支持隐式类型转换和显式类型转换的重载决策。
2、支持基本二元运算符,如加、减、乘、除等。
3、支持基本一元运算符,如取负、取反、自增、自减等。
4、支持基本关系运算符,如大于、小于、等于和不等于等。
5、实现更加复杂的运算符,如三元运算、[]、()、位运算等。

事实上,运算符重载的提出就是为了解决这些问题。在 CLR 框架下的各种 CLR 语言,均不同程度的支持运算符重载。Visual Basic 在 8.0 版本上(也就是 Visual Studio 2005)也支持了运算符重载,运算符重载除了以上列出的优点外,还具备如下特点。
1、使得代码更加容易理解和阅读。
2、可以利用现有运算符的优先级关系规则处理对象之间的运算。
3、使得代码更加灵活,对象可操作性更好。
4、开发人员可以举一反三,因为他们熟悉了常规值类型上的运算符使用,这样可以直接将这些规则引入到自定义对象上。

下面我们通过介绍复数类的定义,来深入 C# 语言中的运算符重载。

C# 运算符重载决策示例

下面的例子定义一个 Complex 类,实现了复数加、减、乘和除的四则运算。C# 中定义常规运算符的语法如下:

[public | private | protected | internal | internal protected] static <return type> | implicit | explicit operator <operatorName> ( <param list> )

下面是 C# 3.0 代码。

     struct  Complex
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值