Visual Basic 和 C# 在空类型上的不同

  • Jonathan Allen
  • 霍泰稳

2007 年 9 月 19 日

话题:.NET编程语言C#语言 & 开发

在.NET 1.0 发布的时候,VB 和 C# 没有太多的区别,但是随着第四个版本发布的临近,两者之间的区别逐渐拉开。今天让我们一起看看那些在空类型上可能会困扰开发人员的小地方。

空类型是在.NET 2.0 发布的时候被引入的。使用泛型(Generics),任何值类型都可以被包装成空类型,从而可以有空值。在从前,要达到这个效果只可以通过创建一个定制的类,或者将值封装然后指定给类型对象的一个变量。

C# 很快增加了对空类型的语言支持。但是 VB 一直在忙于从 VB 转换到 VB.NET 方面的后遗症,无暇像 C# 那样顾及到这一块,虽然可以用空值,但只能在 API 的级别。

在 9 版本里,Visual Basi 会对空类型全面支持。它会使用一个和 C# 非常接近的语法,但是语义上会有很大的区别。在 C# 中,比较操作要么会返回 true,要么返回 false。但是在 VB 中,因为空值的引入,比较操作可能会返回 true,false 或者 null 等。

 a=null, b=null
Operator C# Result  VB Result 
 == true   Nothing
 !=  false  Nothing
 >  false  Nothing
 <  false  Nothing
 >=  false  Nothing
 <=  false  Nothing
 a=1, b=null
Operator C# Result  VB Result 
 == false  Nothing
 !=  true  Nothing
 >  false  Nothing
 <  false  Nothing
 >=  false  Nothing
 <=  false  Nothing

从上表可以看出在 C# 中出现的一个非常有意思的异常,在 a 和 b 都是空的时候,a==b 返回的是 true,但是 a>=b 和 a<=b 则返回的是 false。

在遇到检查 Boolean 值的时候,C# 是非常清晰易懂的。另外一方面,VB 不得不以某种方式把自己的三状态逻辑映射到 Boolean 值。为了满足像 IF、While 和 Untile 这样的 Boolean 检查,VB 是将 null 等同于 false 处理的。这会导致下面所列出的很有意思的现象:

a = null, b = null 

If a=b Then

'skipped

Else

'this line is executed

End if

If Not (a=b) Then



'skipped

Else

'this line is executed

End if

(a=b) 和 Not (a=b) 都返回 null 值,也都被认定为 false。

真正地理解这些语言中细微的差别和不一致,对于使用空类型的开发人员是非常有必要的,否则就会有 Bug 的产生。

查看英文原文:Visual Basic and C#: Differences in Nullable Types

.NET编程语言C#语言 & 开发