关键词:VB2005 VB8.0 VB.NET Whidbey
从本篇起,我会花几篇贴子讨论这个Visual Basic 2005中引入的重大功能——运算符重载。运算符重载是一项很有趣的功能,使用它可以给自己的类型定义运算符。比如我们常常遇到两个对象“相加”的概念,比如两个矩阵的相加,两个集合相加等等,如果没有运算符重载,我们是用对象的方法来执行这类操作的。比如A和B是具有可相加概念的两个对象,那么传统的方法是提供一个“Add”方法:
A.Add(B)
'或者用A、B所属类型T的一个静态方法
T.Add(A, B)
这样的操作当需要频繁使用各种运算时就会变得复杂和难以理解,比如A + B - C + D就得表示成
A.Add(B).Subtract(C).Add(D)
'或者用A、B、C和D所属类型T的静态方法表示
T.Add(T.Subtract(T.Add(A, B), C), D)
无论那种写法都非常的难看而且冗长。如果我们可以直接使用+或-这样的运算符多好。现在,运算符重载使这个愿望成真了。
Visual Basic 2005中运算符重载的本质是类的一组公共静态方法,每个可以重载运算符都有一个名称,比如二元运算符+号的名称是op_Addition。要注意的是,运算符重载这一特征是不符合公共语言规范(CLS)的,因为大部分语言不支持运算符重载。即使支持运算符重载的主流.NET语言(如C#、Delphi)可重载的运算符与VB支持重载的运算符也不完全相同,因此重载运算符会带来跨语言的障碍。另一个要注意的问题是,重载后运算符的意义应当和运算符原来的意义相似,这也是尽量减少跨语言障碍的规则之一,比如VB和C#的移位运算符都是<<和>>,而Delphi的则是Shl和Shr,如果重载移位运算符用做向流中添加对象(就像C++那样),那么在Delphi中使用该运算符的语法将变得不可理解。以下表格对比了Visual Basic和C#各自支持重载的运算符:
| Visual Basic | C# | 运算符的名称 |
| +(一元) | +(一元) | op_UnaryPlus |
| -(一元) | -(一元) | op_UnaryNegation |
| IsTrue | true | op_True |
| IsFalse | false | op_False |
| (无此运算符) | ! | op_LogicalNot |
| Not | ~ | op_OnesComplement |
| (无此运算符) | ++ | op_Increment |
| (无此运算符) | -- | op_Decrement |
| + | + | op_Addition |
| - | - | op_Subtraction |
| * | * | op_Multiply |
| / | / | op_Division |
| \ | (无此运算符) | op_IntegerDivision |
| & | (无此运算符) | op_Concatenate |
| ^ | (无此运算符) | op_Exponent |
| << | << | op_LeftShift |
| >> | >> | op_RightShift |
| =(判断等值而不是赋值) | == | op_Equality |
| <> | != | op_Inequality |
| < | < | op_LessThan |
| <= | <= | op_LessThanOrEqual |
| > | > | op_GreaterThan |
| >= | >= | op_GreaterThanOrEqual |
| And | & | op_BitwiseAnd |
| Or | | | op_BitwiseOr |
| Xor | ^ | op_ExclusiveOr |
| Mod | % | op_Modulus |
| Like | (无此运算符) | op_Like |
| CType | (用户定义的类型转换) | op_Explicit和op_Implicit |
从这个表可以清楚地看出Visual Basic所支持重载的所有运算符以及Visual Basic与C#支持的运算符中不兼容的部分。
本篇首先介绍普通二元运算符,包括+、-、*、/、\、Mod、&、^、And、Or、Xor、<<、>>和Like。这些运算符重载的语法是:
<attributes> Public Shared Operator OpSymbol(LeftArg, RightArg)As ReturnType
其中LeftArg和RightArg中至少有一个必须是定义运算符的类型,否则将可能会重载定义在别的类型上的运算符。这种普通运算符对返回类型一般没有要求,但建议根据运算符的意义而定。比如&运算符通常返回字符串而Like运算符通常返回布尔型变量。下面的例子展示了重载一个向量结构的+运算符,以便进行两个向量和的运算:
Public Structure MathVector
Public x, y, z As Double
Public Sub New(initX As Double, initY As Double, initZ As Double)
x = initX
y = initY
z = initZ
End Sub
Public Shared Operator +(left As MathVector, right As MathVector) _
As MathVector
Return New MathVector(left.x + right.x, _
left.y + right.y, _
left.z + right.z)
End Operator
End Structure
这些运算中的+、-、*、/、\、<<、>>、^等运算符隐含了对赋值运算符的重载,比如重载了+就相当于重载了+=运算符,但是不能直接重载赋值运算符。普通二元运算符重载非常容易,也最为常用。下次我们讨论一元运算符和比较运算符。
打印 | 张贴于 2004-06-05 22:10:00 | Tag:技术随笔 Visual Basic 2005 新功能点评
留言反馈
VB也不是只有从别的语言抄来的东西,比如我将介绍的My就是这样一个特征。
C#也好,VB.NET也好,不过是两个马甲而已 :P