zoukankan      html  css  js  c++  java
  • 不为人知的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方法进行数值比较,因此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)”来加以判断

  • 相关阅读:
    poj 2485 Highways 最小生成树
    hdu 3415 Max Sum of MaxKsubsequence
    poj 3026 Borg Maze
    poj 2823 Sliding Window 单调队列
    poj 1258 AgriNet
    hdu 1045 Fire Net (二分图匹配)
    poj 1789 Truck History MST(最小生成树)
    fafu 1181 割点
    减肥瘦身健康秘方
    人生的问题
  • 原文地址:https://www.cnblogs.com/ServiceboyNew/p/2348068.html
Copyright © 2011-2022 走看看