VB是否真的不区分大小写?

128

我不是想发起争论,但通常说法是Visual Basic是大小写不敏感的,而C语言则不是(并且这似乎是一件好事)。

但是我的问题是:在Visual Basic中到底哪些部分是大小写不敏感的?当我输入...

Dim ss As String
Dim SS As String

在将代码插入到Visual Studio 2008Visual Studio 2010 IDE时,第二个IDE会出现警告“当前块中已经声明了局部变量SS”。在VBA VBE中,它不会立即发生错误,而是自动更正大小写。

我是否错过了什么,认为Visual Basic不区分大小写的论点?(如果您知道或愿意回答,为什么这样做是不好的?)

我为什么要提出这个问题?

多年来,我一直在使用Visual Basic的各种方言,有时作为业余爱好者,有时为小型企业相关程序在工作组中。在最近六个月中,我一直在开发一个大型项目,比我预期的要大得多。许多示例源代码都是用C#编写的。我没有任何迫切的愿望学习C#,但如果C#提供了Visual Basic没有的功能(相反,VB.NET提供了XML字面量),那么我想了解更多关于该功能的信息。因此,在这种情况下,经常有人争论C语言是区分大小写的,这很好,而Visual Basic不区分大小写,这很糟糕。我想知道...

  1. 既然编辑器中的每一个例子都变成了大小写敏感(也就是说它被自动更正),那么Visual Basic到底是如何不区分大小写的?
  2. 如果VB.NET的大小写方式在某种程度上限制了我的代码编写,那么这是否足以令我考虑转向C#?

5
我之前也曾对这件事感到好奇。 - NakedBrunch
10
不确定您是否理解"大小写不敏感"的含义。因为VB实际上是大小写不敏感的,所以SS和ss是相同的名称,而在C语言中它们则不同。 - Ed S.
1
宅男,我强烈建议将这个问题集中在VB不区分大小写的含义以及它是如何实现的上。关于语言是否应该不区分大小写的问题可能会引发争论。如果你真的很好奇,可以在另一个问题中提出。 (我建议你不要这样做,但如果你一定要这样做,那就打上主观标签并将其设为社区wiki) - MarkJ
19
你现在(或曾经)的想法是颠倒的。正是因为编译器不区分大小写,才会出现"变量SS已经声明"的错误提示。如果它是区分大小写的,你要么会得到一个"ss变量未使用"的提示,要么根本没有错误提示,但如果你交替使用大小写会出现bug。 - Adriano Varoli Piazza
1
我认为你没有意识到的是VB是“不区分大小写”的。这与许多其他流行语言(如C ++,C#,Java等)不同-因此对于编译器来说,ss与SS是相同的。 - Cam
显示剩余4条评论
13个回答

1

在VB.NET中,一个标识符的大小写不同的“拼写”可以很容易地创建出来,而无需费太多力气。在声明该标识符的文件中更改标识符的大小写,而不使用“重命名”功能,将不会导致其他文件中的名称更新,但编辑包含该名称的任何行将使其符合当前定义。

通过这种方式,可以确定VB.NET大多数情况下是不区分大小写的,但它确实使标识符的大小写对CLR可用,CLR可能会以区分大小写的方式使用该信息。


1
隐藏符号(例如本地隐藏字段)也不区分大小写。
这里是一个示例:example
Public Class C
    Public Name As String

    Public Function M(name As String) As Boolean
        Return String.Equals(name, Name) ' case differs
    End Function
End Class

VB.NET编译器的输出被反编译为以下C#代码(因此等效)。
public class C
{
    public string Name;

    public bool M(string name)
    {
        return string.Equals(name, name); // both lowercase
    }
}

string.Equals会将字段传递两次。本地变量被隐藏,不考虑大小写。该语言是不区分大小写的。

要明确引用成员,例如此字段,必须通过Me取消引用成员:

Return String.Equals(name, Me.Name) ' differentiate field from local

0

VB.NET不区分大小写。

示例:

1.

Dim a As Integer
Dim A as Integer

2.

Sub b()
    'Some statement(s) here
End Sub
Sub B()
    'Some statement(s) here
End Sub

3.

Function c() As Integer
    'Some statement(s) here
End Function
Function C() As Integer
    'Some statement(s) here
End Function

所有这些代码都会产生编译时错误
对于第一个示例,将显示一个错误,指出“本地变量'A'已在当前块中声明”。
对于第二个和第三个示例,将显示错误,分别指出“'Public Sub b()'具有相同签名的多个定义。”和“'Public Function c()As Integer'具有相同签名的多个定义。”。
从这些错误中可以注意到,对于变量和过程/函数,错误在不同的位置抛出。对于变量,错误在第二个声明处抛出,而对于过程/函数,则在相同代码的第一个声明/定义处抛出。
正如某个评论中的用户所说,在后台不断检查和/或更正VB.NET代码;您可以在VS IDE中的“错误列表”窗口中看到此错误。由于这是AN ERROR而不是WARNING,因此在解决错误之前,代码将无法编译。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接