我们通常认为Nothing(VB.NET)中和null(C#)中的功能是完全一样的。其实如果你这样认为的话,就大错特错了。
的确,一般情况下,如果把null(vb中把Nothing赋值给一个引用类型,那么此二者结果是等同的)。但是VB.NET中还允许你把Nothing赋值给值类型(无论是基本值类型,还是自定义的Struct值类型),这在C#中是不允许的(造成编译错误)。比如:
Dim i As Integer = Nothing
上面这段代码的意思是:给i设置自身类型的初始值(相当于i=0),在C#中等同于:
int i = default(int);
另外,VB.NET的Is是用来判断两个引用对象(地址)是否相同,“=”只被用于检测两个对象的内容值是否相同(等价于直接调用Equals方法进行数值比较,因此VB.NET中“=”只能用于值类型的判断,除非重写Equals方法和重载运算符=,才允许对引用类型的内容进行比较判断)。
Dim s1 As String = "a"
Dim s2 As String = "a"
Console.WriteLine(s1 Is s2)
以上就严格证明了String的确是存在“字符串池”的,因为两者引用对象都是s1所指向的那个存储空间。相比较之下,C#要证明就不是很容易了。因为C#的双等于虽然可以直接作用于任意两个类进行比较,而且比较的是两个类的句柄地址,但是它可以被重写(通过运算符重载“双等于”特性,也等价于调用Equal函数),这样往往无法分辨清楚究竟是比较两者之间存储的实质内容是否一致,还是对象引用地址是否一致。
在两个引用类型中,若要比较某对象是否可以安全转化为另外一个对象,VB.NET直接可以使用“TypeOf(实体名) Is 类名”即可。相对应地,C#中直接用“实体名 is 类名”或者“if(实体名 as 类名==null)”来加以判断。