VB真的不区分大小写吗?

Tod*_*ain 119 vb.net vba case-sensitive case-insensitive

我不是试图在这里开始论证,但无论出于何种原因,它通常表明Visual Basic不区分大小写,C语言不是(并且不知何故这是一件好事).

但这是我的问题:Visual Basic在哪里确实不区分大小写?当我输入...

Dim ss As String
Dim SS As String
Run Code Online (Sandbox Code Playgroud)

...进入Visual Studio 2008Visual Studio 2010 IDE,第二个警告" 已在当前块中声明了局部变量SS ".在VBA VBE中,它不会立即引发错误,而只是自动更正案例.

我在这里错过了一些关于Visual Basic不区分大小写的论点吗?(另外,如果你知道或想要回答,为什么这会是一件坏事?)

为什么我甚至都会问这个问题?

我已经在很多方言中使用过Visual Basic多年了,有时作为业余爱好者,有时候用于工作组中的小型商业相关程序.截至过去六个月,我一直致力于一个比我预期的大得多的大项目.许多示例源代码都在C#中.我没有任何学习C#的强烈愿望,但如果有些东西我错过了C#提供的Visual Basic没有(相反的是VB.NET提供XML Literals),那么我想了解有关该功能的更多信息.所以在这种情况下,经常认为C语言是区分大小写的,这很好,Visual Basic不区分大小写,这很糟糕.我想知道...

  1. Visual Basic如何区分大小写,因为代码编辑器中的每个示例都变得区分大小写(意味着案例得到纠正),无论我是否需要它
  2. 如果VB.NET案例在某种程度上限制了我可以用代码做什么,这对我来说是否足以让我考虑转移到C#?

Mar*_*rkJ 106

VBA和VB.NET之间的区别仅仅是因为VB.NET在后台连续编译.编译VBA时会出错.

就像Jonathan所说的那样,在编程时你可以将VB.NET视为不区分大小写,除了字符串比较,XML和其他一些情况......

我觉得你对引擎盖下的内容很感兴趣.嗯,.NET公共语言运行时区分大小写,VB.NET代码依赖于运行时,因此您可以看到它在运行时必须区分大小写,例如,当它查找变量和方法时.

VB.NET编译器和编辑器让你忽略它 - 因为它们纠正了代码中的大小写.

如果您使用动态功能或后期绑定(Option Strict Off),您可以证明基础运行时区分大小写.另一种看待这种情况的方法是认识到像C#这样的区分大小写的语言使用相同的运行时,因此运行时显然支持区分大小写.

编辑如果要使IDE脱离等式,您始终可以从命令行进行编译.编辑代码在记事本,因此具有ssSS看编译器做什么.

编辑来自Jeffrey Richter.NET Framework设计指南第45页.

需要说明的是,CLR实际上是区分大小写的.某些编程语言(如Visual Basic)不区分大小写.当Visual Basic编译器尝试解析对像C#这样的区分大小写的语言中定义的类型的方法调用时,编译器(而不是CLR)会计算方法名称的实际情况并将其嵌入元数据中.CLR对此一无所知.现在,如果您使用反射绑定到方法,则反射API确实能够执行不区分大小写的查找.这是CLR提供不区分大小写的程度.

  • 您可以通过作弊来关闭自动更正.右键单击vb文件,然后选择"打开方式".然后选择"XML(文本)编辑器"之类的东西.您将丢失所有特定于VB的功能,如自动更正. (5认同)

Jar*_*Par 21

这里的部分问题是您需要将语言与IDE体验区分开来.

作为一种语言,VB.NET在标识符方面肯定不区分大小写.调用DateTime.Parsedatetime.parse将结合到完全相同的代码.与C#之类的语言不同,不可能定义仅根据大小写不同的方法或类型.

作为一个IDE,当VB.NET很好地列出一段代码时,它会尝试保留现有标识符的大小写.当你离开当前的逻辑代码行时,会出现漂亮的列表.在这种情况下,你离开第二个声明SS,漂亮的lister注意到有一个具有该名称的现有标识符并将其更正为具有匹配的大小写.

但是,此行为纯粹是作为用户值添加完成的.它不是核心语言的一部分.

  • "我仍然无法理解为什么通过名称中的大小写差异来让多个名称代表不同的东西会是一件好事"< - 在从VBA/VB6/VB.NET切换到C#之前我感觉一样,我认为名字只有不同的案件似乎是完全危险的.然而,在实践中,它被证明是非常有用的,并且令人惊讶的是,它根本不容易出错. (2认同)
  • @Mike我非常不同意这一点.我从来没有见过混合套装的名字做了什么,但造成了混乱. (2认同)
  • 真?我的意思是像void SetColor(颜色){this.color = color}; 我意识到这可能*看起来很危险,但它运行顺畅,编译器不会让你犯错误,并且IntelliSense在"颜色"之后为你提供了正确的成员.与"颜色"相对.困扰我的是,使用"this"不是*需要 - 它由FxCop和/或StyleCop强制执行(我忘了哪个),但我希望有一个设置让IDE始终强制执行此操作访问类成员而不是潜在地允许范围被意外地遮蔽. (2认同)

Jon*_*len 16

VB 大部分不区分大小写,但也有例外.例如,XML文字和理解区分大小写.字符串比较通常区分大小写,与T-SQL不同,但是有编译器切换使字符串比较不区分大小写.当然,在处理继承,COM和动态语言运行时时也存在边缘情况.

  • 关于案例的重要性,如XML Literals和字符串比较.但是当我们说它主要是**不区分大小写时,我们到底在说什么呢?转移到Outlook VBA,作为一个例子,如果我输入`Dim mi as mailitem`和`subject = mi.subject`,对象名称将自动更正为`MailItem`和`mi.Subject`.compilier是否关心(因为它会*总是*自动纠正这个)或者是这个漂亮的代码还是......? (3认同)
  • 编译器不在乎。您可以通过在记事本中编辑文件并使用命令行编译器来测试这一点。 (2认同)

Han*_*ant 9

是的,VB.NET编译器以不区分大小写的方式处理标识符.是的,当它使用用另一种语言编写的程序集或使用COM组件时会导致问题.前一种情况由公共语言规范涵盖.相关规则是:

要使两个标识符被视为不同,它们必须不同于它们的情况.

COM案例由类型库构建器粗略地处理,它强制具有相同名称的标识符的大小相同.即使这些标识符具有不同的角色.换句话说,名为"index"的方法参数将强制将方法名称"Index"重新设置为"index".正如你可能想象的那样,这产生了相当多的头痛


And*_*ely 6

VB是大小写保留(在IDE中)但不区分大小写.它在某种程度上就像Windows文件系统.Hello.txt和hello.txt被认为是相同的文件名.

IDE假定声明变量是该变量的"正确"大小写,并调整该变量的每个实例与声明匹配.它出于眼睛糖果和一致性的原因,但不是功能性.

我已经看到几个实例,其中案例没有自动更改以匹配声明,并且语句的工作原理相同.您还可以使用任何文本编辑器编写在不同情况下编译得很好的代码.

附注:

多数人民认为,在不区分大小写的方式.当我们看到"狗"这个词时,这个词在我们的脑海中被翻译成了意义.这个词的意思不是基于案例(即不管拼写它是"DOG","DoG"还是"dOG"仍然吠叫.) 计算机将单词视为不连续的位.大写和小写是不同的位模式,因此是不同的.

由于大多数程序员都是人,因此案例不敏感似乎更适应人们的思维方式,而案例敏感性更多地是关于人类如何思考机器的约束.

  • 除了程序员需要区分对象和类,并且传统上使用大小写的改变(不是必需的,只是一个约定).因此,`object.method()`和`Object.Method()`立即被识别为对象和类引用和方法(如果您符合该编码约定).与英语相同,您可以使用大写字母区分专有名词和句子的开头.因此,在阅读或编程时,我不会认为案例不敏感,否则我会错过一些含义. (4认同)

Sar*_*raz 5

这是您正在使用的编辑器的一部分,它们可能表现不同,但事实是Visual Basic 确实是不区分大小写的语言.所以,ss并且SS是一样的.

有关更多信息,请查看VB.NET Basics教程:)