【问题标题】:VB.NET language and Nothing : why is it the way it is?VB.NET 语言和Nothing:为什么会这样?
【发布时间】:2010-11-05 07:12:08
【问题描述】:

这是一个关于 VB.NET 语言的问题。由于我每天都在使用它,所以我只是试图了解它的一些构造背后的动机。

我才发现这一行:

If myObject Is Nothing then

和这个一样正确:

If Nothing Is myObject Then

同样的结果。使用 ildasm,我们可以看到这些行被翻译成:

if myObject = null then

if null = myObject then

嗯,但是,在 VB.NET 中,你不能写:

if myObject = Nothing Then

编译器不会接受。

嗯,对我来说,If Nothing Is myObject 远不如 If myObject = Nothing .

为什么 VB.NET 作者的想法正好相反?有什么提示吗?

【问题讨论】:

  • 这是为了确保 c 程序员会继续讨厌 VB。 :P
  • @Jon - 你不必是 C 程序员就可以讨厌 VB。只是说。
  • 当然,用 C 编写喜剧代码要困难得多,例如:If You Is Nothing Then WontBeNothing()
  • “Is You Is or Is You Aint My.Baby”是否编译?

标签: .net vb.net compiler-construction


【解决方案1】:

您遇到的问题是 VB.Net 区分了两种类型的对象比较。即参考和价值比较。

VB.Net 中的“Is”运算符用于参考比较。当所讨论的值既是引用类型又是可空值时,可以使用此方法。尝试以这种方式比较值类型将导致编译错误。

“=”运算符用于值比较。值比较只能用于在其类定义中定义显式 =、 运算符对的类型。等式的实际实现取决于运算符的实现。

C# 采用不同的方法,它使用 == 进行值和引用比较。使用哪个取决于几个因素,包括被比较的值的类型和某些相等方法的实现。

【讨论】:

  • 我在这里等着你来写答案。 :) 如果你迟到 10 秒,我正要提交我的。
  • @Mehrdad,很高兴我及时刷新了 :)
【解决方案2】:

它是从 VB6 和 COM 继承的这些东西之一。 VB6 对引用类型对象(可实例化的)和本机类型(例如 int)进行了区分。必须使用“Set”运算符创建和分配引用类型,而本机类型只使用“=”。

【讨论】:

    【解决方案3】:

    好吧,在某些情况下你可以写If myObject = Nothing Then,但它不会是一个空比较:

    Dim someValue As Integer
    If someValue = Nothing Then
        ' do something '
    End If
    

    以上代码等价于以下内容:

    Dim someValue As Integer
    If someValue = 0 Then
        ' do something '
    End If
    

    在这种情况下,您有一个具有“emtpy”值的值类型(例如,Integer 为 0,Point 结构为 Point.Empty)。 Is 运算符执行引用比较(检查比较对象是否为同一实例),而等号是值比较

    【讨论】:

    • 是的,刚刚试过:你可以写:“if 2 = Nothing Then”,编译器就可以了。此外,正如您所说,“如果 0 = Nothing”总是正确的......太好了,谢谢!
    • 我认为这是 VB 语言中令人困惑的部分。对于新手来说,不清楚 Nothing 意味着值类型的“默认值”...
    【解决方案4】:

    另一个想法是,如果您查看一些循环和条件语法,则 VB 旨在更加冗长。举几个例子:

    VB:

    If x==0 Then
    End If
    
    While 
    End While
    
    For i = 0 to 10 Step 2
    Next i
    

    C#

     If x==0 
     {
     }
    
     While 
     {
     }
    
     for (int i = 0; i<=10;i+2)
     {
     }
    

    看到 VB.Net 代码中所有多余的单词了吗?这是造成差异的另一个可能原因。

    【讨论】:

    • 好吧,我是 C、C++、C# 的粉丝,现在必须使用 VB.NET 编写代码...... :( 但是,总而言之,它一点也不差 : VB.NET真的很冗长,但它是另一种语言,我很高兴找到它的缺陷和优势。谢谢:)
    • 我经历过几次这种转变。第一次是从 C/C++ ISAPI 扩展到经典 ASP 中的 VBScript,然后又是从 VBScript 到 ASP.Net 中的 C#.Net,所以我现在已经看过几次了,但我已经在各种版本中编写了足够的代码BASIC 和 C 语言,我可以很容易地来回切换。
    • 如果我们计算字符数,您已经省略了 C# if 语句中的强制括号。
    【解决方案5】:

    Is Nothing 的使用可以追溯到经典的 Visual Basic 时代(即 6.0 及更低版本)。

    为了保持一些表面上的兼容性(就像 VB6 处理 If 语句的非延迟评估的方式一样),这已被转移到 VB.NET 中。

    幸运的是,正如ocdecio 指出的那样,还有其他类似的 peccadillos 没有被继承到 VB.NET 中,例如用于将对象分配给变量的 Set 语句。

    【讨论】:

      猜你喜欢
      • 2018-09-06
      • 2018-10-15
      • 2011-06-03
      • 2018-06-08
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多