Nothing 和 Is

我们通常认为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方法进行数值比较)。

 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)”来加以判断

'添加参数
If Param IsNot nothing Then
sqlCmd.Parameters.AddRange(Param)
End If

这里IsNot用来判断数组Param与nothing是否相同,来确定,Param数组是否为空,在这里为什么要用IsNot nothing来做判断呢?怎么不是VbNull等呢?

其实,nothing在变量或数组等声明的时候,就应该赋给变量的,比如Dim intA as integer =nothing,但我们经常不写,我们需要给声明的变量赋其它值或对象,很多编译器IDE对变量都要检查其是否初始化,写上nothing是一种好的编程习惯,当我们判断一个对象资源是否释放或是否为空时,感觉会很有用例如:

If Not Isnothing(Me.GetsqlCnn()) Then
Me.GetsqlCnn().Close()
End If

VB.NET 中nothing是数据类型的认值,包括值类型、对象类型、自定义类型等,相当于C#中的Null

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...