现在的位置: 首页 > 综合 > 正文

Nothing 和 Is

2013年08月28日 ⁄ 综合 ⁄ 共 1210字 ⁄ 字号 评论关闭

       我们通常认为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

抱歉!评论已关闭.