VB真的不区分大小写吗?

Posted

技术标签:

【中文标题】VB真的不区分大小写吗?【英文标题】:Is VB really case insensitive? 【发布时间】:2011-01-19 01:10:21 【问题描述】:

我不想在这里开始争论,但无论出于何种原因,通常都表示 Visual Basic 不区分大小写而 C 语言不区分大小写(不知何故这是一件好事)。

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

Dim ss As String
Dim SS As String

...进入Visual Studio 2008 或Visual Studio 2010 IDE,第二个IDE 出现“局部变量SS 已在当前块中声明”的警告。在 VBA VBE 中,它不会立即抛出错误,而是自动更正大小写。

Visual Basic 不区分大小写的论点我在这里遗漏了什么吗? (另外,如果您知道或愿意回答,那为什么会是一件坏事?)

我为什么还要问这个问题?

我在很多地方都使用过 Visual Basic 多年来的方言,有时如 一个业余爱好者,有时是为了小 与业务相关的程序 工作组。截至最近六个月, 我一直在做一个大项目, 比我预期的要大得多。很多 的示例源代码 在 C# 中。我没有任何燃烧 渴望学习 C#,但如果有 我在那个 C# 上错过的东西 提供 Visual Basic 不提供的功能(相反 将是 VB.NET 提供XML Literals),那么我想知道 有关该功能的更多信息。所以在这个 在这种情况下,人们经常认为 C 语言区分大小写并且 很好,Visual Basic 就是这样 麻木不仁,这很糟糕。 ID 想知道...

    Visual Basic 到底是怎样的 不区分大小写,因为每个 代码编辑器中的单个示例 变得区分大小写(意思是 案件得到纠正)我是否想要 不管是不是。 这是否足以让我 如果 VB.NET 的情况,考虑转移到 C# 以某种方式限制了我能做的事情 有代码吗?

【问题讨论】:

+1 我以前也想过同样的事情。 嗯...不确定您是否理解区分大小写的意思。因为 VB 实际上是不区分大小写的,所以 SS 和 ss 同名,而在 C 中它们不会。 @ed:我不能在VB中同时使用SSss,无论我先使用哪个,编辑器都会使用。 Otaku,我绝对建议将这个问题集中在说 VB 不区分大小写的确切含义以及它是如何实现的。可悲的是,不区分大小写的语言是否更好的问题可能会引发一场激烈的战争。如果您真的很好奇,请在另一个问题中提问。 (我建议您不要这样做,但如果您必须将其标记为主观并使其成为社区 wiki) 你正在(或曾经)考虑这个问题。正是因为编译器不区分大小写,错误读取为“变量 SS 已声明”。如果它区分大小写,你会得到一个“未使用的 ss 变量”或根本没有错误,如果你交替使用一个和另一个,则会出现错误。 【参考方案1】:

VBA 和VB.NET 的区别只是因为VB.NET 在后台连续编译。编译 VBA 时会出现错误。

就像Jonathan says,在编程时,除了字符串比较、XML 和其他一些情况之外,您可以认为 VB.NET 不区分大小写...

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

VB.NET 编译器和编辑器允许您忽略这一点 - 因为它们在您的代码中更正大小写

如果您使用动态功能或后期绑定(Option Strict Off),您可以证明底层运行时区分大小写。另一种理解方式是意识到像 C# 这样区分大小写的语言使用相同的运行时,因此运行时显然支持区分大小写。

编辑如果你想把 IDE 排除在外,你可以随时compile from the command-line。在Notepad 中编辑您的代码,使其具有ssSS,看看编译器做了什么。

编辑引用Jeffrey Richter 在.NET Framework Design Guidelines 第45 页。

需要明确的是,CLR 实际上是 区分大小写。一些编程 像 Visual Basic 这样的语言是大小写的 不敏感。当 Visual Basic 编译器 试图解决对 a 的方法调用 类型定义在区分大小写 像 C# 这样的语言,编译器(不是 CLR)计算出实际情况 方法的名称并将其嵌入 元数据。 CLR 一无所知 这。现在,如果您使用反射 绑定到方法,反射 API 确实提供了执行以下操作的能力 不区分大小写的查找。这是 CLR 提供的范围 不区分大小写。

【讨论】:

迄今为止我听到的最佳答案。有没有办法证明这一点 VB.Net 编译器和编辑器让你忽略了这一点?有没有办法关闭自动更正?或者有没有办法在 MSBuild 中编译 not 用 VS IDE 编写的 sln,它同时使用 ssSS,它会按预期编译和工作? 您可以通过作弊关闭自动更正。右键单击 vb 文件并选择“打开方式”。然后选择“XML(文本)编辑器”之类的东西。您将失去所有 VB 特有的功能,例如自动更正。 +1 很好的答案,以及 Otaku 的好问题(我想你已经知道但想得出一个好的定义嘿?) VB.NET 编译器/IDE 不是 100% 不区分大小写的。例如Dim pdfWriter As PDFWriter 是完全有效的。 VB.NET 允许您区分类名和变量名,这是一种很好的接触,因为它在完全区分大小写的语言中很常见。 VB 方式适合互操作性。示例:在 C# 中创建一个 DLL,其中 email 作为 String,Email() 作为属性,其中包含 inotifypropertychanged 事件。 C# 可以正常编译并生成 DLL。尝试在 VB 或任何类似语言中引用此 DLL。它会说库中的变量电子邮件/电子邮件存在冲突。代码分析工具指出这是 C# 编译器中的问题,而不是 VB 编译器中的问题。【参考方案2】:

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

作为一种语言,VB.NET 对于标识符肯定是不区分大小写的。调用 DateTime.Parsedatetime.parse 将绑定到完全相同的代码。而且与 C# 等语言不同,无法定义仅因大小写而异的方法或类型。

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

不过,这种行为纯粹是为了用户增值。它不是核心语言的一部分。

【讨论】:

感谢 Jared,很高兴知道它只是 IDE。我仍然无法理解为什么仅通过名称的大小写差异来使用多个名称代表不同事物是一件好事,但我想那是另一天。 我不认为 Jared 的意思是它只是 IDE。我认为他说过编译器不区分大小写,因此它认为ssSS 相同,但也有助于阅读IDE 在您键入时将SS 更正为ss。因此,即使 IDE 没有更正大小写,编译器仍会将这两个标识符视为相同。 “我仍然无法理解为什么有多个名称仅通过名称的大小写差异来代表不同的事物是一件好事” @Mike 我非常不同意这一点。我从来没有见过混合大小写的名字除了引起混淆之外什么都做。 真的吗?我的意思是 void SetColor(color Color)this.color = color;我意识到这可能看起来很危险,但它运行顺利,编译器不会让您出错,并且 IntelliSense 在“颜色”之后为您提供正确的成员。与“颜色”相比。这里困扰我的是不需要使用“this”——它是由 FxCop 和/或 StyleCop 强制执行的(我忘记了),但我希望有一个设置IDE 在访问类成员时始终强制执行此操作,而不是潜在地允许范围被意外隐藏。【参考方案3】:

VB大部分不区分大小写,但也有例外。例如,XML 文字和理解是区分大小写的。与 T-SQL 不同,字符串比较通常区分大小写,但有编译器开关可以使字符串比较不区分大小写。当然,在处理继承、COM 和动态语言运行时时也会出现边缘情况。

【讨论】:

关于大小写确实重要的要点,例如 XML 文字和字符串比较。但是当我们说它大部分不区分大小写时,我们到底在说什么?转到 Outlook VBA,例如,如果我键入 Dim mi as mailitemsubject = mi.subject,对象名称将自动更正为 MailItemmi.Subject。编译器是否关心(因为它会总是自动更正)或者这个漂亮的代码还是......? 编译器不在乎。您可以通过在记事本中编辑文件并使用命令行编译器来测试。【参考方案4】:

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

考虑两个标识符 不同,它们必须相差更多 不仅仅是他们的情况。

类型库构建器相当粗略地处理 COM 案例,它强制具有相同名称的标识符的大小写相同。即使这些标识符具有不同的角色。换句话说,名称为“index”的方法参数将强制将方法名称“Index”重新转换为“index”。正如您可能想象的那样,这已经产生了相当多的头疼:)

【讨论】:

【参考方案5】:

VB 保留大小写(在 IDE 中)但不区分大小写。它在某种程度上类似于 Windows 文件系统。 Hello.txt 和 hello.txt 被认为是同一个文件名。

IDE 假定声明变量是该变量的“正确”情况,并调整该变量的每个实例以匹配声明。它这样做是出于美观和一致性的原因,但不是出于功能性考虑。

我见过几个案例没有自动更改大小写以匹配声明,并且声明的工作方式相同。您还可以使用任何文本编辑器编写在不同情况下都能正常编译的代码。

旁注:

大多数以不区分大小写的方式思考。当我们看到“狗”这个词时,这个词在我们的脑海中就被翻译成了意义。单词的含义不基于大小写(即,无论拼写为“DOG”、“DoG”还是“dOG”,仍然会吠叫。)计算机将单词视为离散的比特袋。大写和小写是不同的位模式,因此是不同的。

由于大多数程序员都是人类,不区分大小写似乎更适应人们的思维方式,而区分大小写更多地是关于人类根据机器的限制来调整他们的思维方式。

【讨论】:

除了程序员需要区分对象和类,并且传统上使用更改大小写来做到这一点(不是必需的,只是一个约定)。这样object.method()Object.Method() 就会立即被识别为对象和类引用和方法(如果您符合该编码约定)。与英语相同,您可以用大写字母区分专有名词和句子的开头。所以在阅读或编程时,我不会不区分大小写,否则我会失去一些意义。 @Jason,这完全取决于您的习惯。刚开始学习 C 语言编程的学生一开始会对区分大小写提出无数抱怨,然后在上几门课后就习惯了。 object.method() 和 Object.Method() 只是一个约定,是区分大小写的最强案例。我不得不修改一个由其他人编写的程序,该程序在同一范围内有两个名为 temp 和 Temp 的变量,我会告诉你很难将它们直接记在脑海中。虽然我们可以通过大写来识别一个普通名词,但“bob”和“Bob”这两个词在我们的大脑中的意思是一样的。 为什么 IDE 在这种情况下会保留大小写? (对不起)。我认为 IDE 保留了大小写,因为 MS 设计人员认为大小写在大脑中具有某种语义,它确实如此。但实际上 VB IDE 认为 formForm 相同,这对我来说无论如何都是令人困惑的。在tempTemp 的情况下(再次抱歉),您可以轻松地使用C# 中的重构工具将Temp 重命名为bobTemp 或其他任何东西。但是,我正在维护一些 VB,并且有人已经完成了Dim form As Form。现在,当我重命名时,它会同时重命名类和对象引用。呸! @Jason,在 VB 中我总是说“Dim aform as Form”,但我离题了。 VB 在搜索中支持区分大小写。此外,我会搜索“As Form”并将其替换为“somethingstupid”,然后将表单重命名为合理的名称,然后将“somethingstupid”重命名为“As Form”。我实际上喜欢它改变大小写,因为它验证我没有粗手指变量名。 是的,但这不能替代重构工具,当名称相同(或仅在 VB 中大小写不同)时,该重构工具将区分类和实例引用。 C# 重构工具似乎能够做到这一点。我不会将类和实例命名相同。在 C# 中,我将使用大小写来区分,但在 VB 中我不能这样做,所以我使用字母作为前缀。显然我的问题是我正在维护使用相同名称的其他人的代码。但是这个讨论对于 cmets 来说太大了,所以我就留在这里了。【参考方案6】:

这是您正在使用的编辑器的一部分,它们的行为可能不同,但事实是 Visual Basic 确实是不区分大小写的语言。所以,ssSS 是一样的。

Please have a look at VB.NET Basics tutorial for more information :)

【讨论】:

哦,这很有趣。有什么地方我可以查看这个细节吗?我还没有测试过,但是想想 VBScript,你可能是对的。 @Otaku:请再次查看我的回答,我现在提供了链接。谢谢 我对 VB 很熟悉,谢谢 :) 我不确定你想让我在那个页面上看到什么。【参考方案7】:

我不确定我是否理解你? VB 不区分大小写,所以 ss 和 SS 是同一个变量,所以编译器正确地抱怨你重新声明了变量。

我认为变量不区分大小写,但函数名是。

【讨论】:

但如果我使用ss,然后输入SS,它会自动更正为ss,这让我相信编译器确实关心大小写。 @oTAKU:改变大小写的是 IDE,而不是编译器。 VB 仍然不关心大小写。 IDE 正在尝试清理代码以使变量始终保持不变。【参考方案8】:

是的,VB 不区分大小写。它有时会让那些不习惯的人陷入一个循环。

【讨论】:

【参考方案9】:

人们不必在 VB.NET 中费尽心思来创建具有不同标识符的大写/小写“拼写”的代码。在不使用“重命名”函数的情况下更改文件中声明标识符的大小写不会导致名称在其他文件中更新,但编辑包含该名称的任何行将使其符合当前定义。

通过这种方式,可以确定 VB.NET 基本上不区分大小写,但它确实使 CLR 可以使用标识符的大小写,而 CLR 可能会以区分大小写的方式使用该信息。

【讨论】:

【参考方案10】:

我只能提供这一点,正如我在 80 年代早期的编程教科书中所记得的那样,区分大小写的语言(当时)严格旨在减少编译时错误。也就是说,“严格”是为了发展一种更准确的编码学科。事实证明,为变量、类、方法、函数以及您希望添加的任何其他内容添加了适当的标签,也随之发展。

我记得几乎所有这些书籍都包含了大写、小写等的推荐模式。众所周知,其中大部分已经被抛弃,或者我应该说,在实践中被忽略了,除了高端生产房屋和 CASE 解决方案,或针对那些已达到更高技能水平的人。我认为每个人都会经历这种学习曲线。

鉴于这些语言和 IDE 的进步,更好的问题是,哪种语言可以缩短我的开发时间?当然,如果您不熟悉各种语言,那么您的选择是有限的。

【讨论】:

【参考方案11】:

我会试着回答你的第二个问题。

“如果 VB.NET 案例在某种程度上限制了我可以用代码做的事情,这是否足以让我考虑转向 C#?”

使用 C# 创建 WCF WebService。创建一个 DataContract(1 类)。一个具有“字符串电子邮件”属性。另一个将“字符串电子邮件”作为另一个属性。您选择理解为个人电子邮件或办公室电子邮件。或者它可能在两个不同的 DataContracts 中。

对于 C#,这很好。 Web 服务创建良好。 C# 程序可以轻松创建 WSDL,一切都很好。

现在尝试使用 VB(任何版本)创建 WSDL。它会说“email”已经被声明并且 WSDL 生成失败。

和大家一样,我认为这是 VB 语言的一个缺点。但是!!!

使用 FxCOP 并分析原始 C# 代码。 FxCOP 说使用电子邮件/电子邮件是个问题。建议使用不同的名称来支持不区分大小写。另请注意,截至日期 .NET 框架有 106 种编程语言,并且有许多语言具有区分大小写功能。我们都在向云迁移,并希望所有编程平台/语言都可以访问我们的服务。

因此,区分大小写是您在程序中的选择,如果您是 C 人,您会喜欢的。如果该程序将被其他非 C 程序使用/访问,您需要支持不区分大小写,但您的语言是您的选择。

http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Visual_Basic_.NET http://www.vbrad.com/article.aspx?id=65

【讨论】:

云使用区分大小写的 URI(这对代理和缓存服务器尤其重要)。【参考方案12】:

符号的隐藏(例如本地隐藏字段)也不区分大小写。

这是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 被传递两次。无论大小写如何,本地都是隐藏的。语言不区分大小写。

要显式引用 a 成员,例如此字段,您必须通过 Me 取消引用该成员:

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

【讨论】:

【参考方案13】:

我没有看到任何人对您最后明确的第二个问题发表评论:“2:如果 VB.NET 案例在某种程度上限制了我可以用代码做的事情,这是否足以让我考虑转向 C#?”

我更喜欢 C# 让程序员选择是否限制程序员的选项的更多选项方法。我非常喜欢 C#,但仅就区分大小写而言,我什至不认为它接近于学习一门语言,因为它区分大小写。所有的特性都很重要,当我看到 C# 和 VB.NET 两者的优点时,我非常喜欢 C#。但我会给你一个真正平衡的观点,有偏见,是的,因为我有偏好,但我也会诚实地说 C# 的缺点。

首先,两种语言各有利弊。你可以用一种语言做而不能用另一种语言做的差异正在减少,幸运的是,微软正在改进这两种语言,而且他们似乎没有对任何一种语言表现出不公平的偏袒。

当 C# 第一次出现时,VB 没有可以放在方法之前的 XML cmets,而我在 C# 中很喜欢这种方法。我讨厌在 VB.NET 中。但多年来我已经看到,许多不在一种语言中的功能被添加到另一种语言中。 (同一个 MS 开发团队同时开发 C# 和 VB,因此功能应该变得非常相似是有道理的。)

但是你问了 C# 有什么 VB 没有。这是我能立即想到的一些:

1:C# 更简洁,输入更少……在很多方面!当提出相反的要求时,我什至看到过愚蠢的说法,即 VB 可以节省打字。但请听那些告诉你他们使用两种语言的人,而且他们很少使用任何一种语言。我在家里同时使用 C# VB、C#,因为我喜欢它(以及当我在工作中使用 C# 时),而我最近的工作要求我使用 VB 而不是 C#。所以我现在越来越频繁地使用 VB(大约 10 个月了),但在我个人的证词中,我更喜欢 C#,就实际打字而言,VB 的打字要多得多。我读过的一个例子是有人实际上试图说VB更简洁,给出了一个'with ...'示例,其中带有一个长变量,所以在VB中,你可以只使用'.property'。声称 VB 需要更少的输入是愚蠢的。 VB 在某些方面(不仅仅是这个示例)更短,但在实际实践中,C# 更简洁的情况更多。

但我认为 C# 更简洁的最大原因是 VB 的冗长“IF/THEN”语句。 if 语句很常见。在 C# 中没有“then”字可键入! :) 所有的 'end ...' 语句都需要输入,在 c# 中,通常只是一个右括号''。我读到有些人声称 VB.NET 中的这种更冗长是 VB 的一个优势,因为几个结束块语句/符号可以嵌套并立即彼此相邻结束,但我完全不同意。一个人几乎总是可以用 C# 或 VB 编写比其他程序员更好的程序,因为下一个代码修订版可以设计得更好。这适用于“在 C# 中混淆众多右大括号”加上如果嵌套块都是相同的类型,就像几个嵌套 IF 一样,那么 VB 会遇到与 C# 中相同的问题。这在 VB 中没有优势。这种情况正是我喜欢用两种语言评论我的结束符号或结束语句的原因。是的,这样做更冗长,但是在任何一种语言中,您都可以选择清楚,这在基于判断的具体情况下很重要。我认为代码清晰非常重要。

2: VB 没有多行 cmets。当我使用 VB 时,我并不介意。然后我去了一些 C 风格的语言。现在我回来主要是在工作中使用 VB.NET,我想念他们。它只是你觉得方便,然后不得不失去的东西。 :(

3: VB 的 'andalso' 和 'orelse' 在 C# 中只是简单地输入 '&&' 和 '||' 时键入所有内容相当烦人。再次,少打字。这在我的 VB 和 C# 代码中并不罕见。如果有的话,对于功能,“OR”与“OrElse”通常无关紧要,除了“OrElse”对计算机来说更快,所以如果程序员在 VB 中只使用“Or”和“And”,那么它会产生不太理想的代码喜欢代码清晰的人。 'Or' 比 'OrElse' 更容易浏览。

4:在 C# 中代码放置更灵活。当一行很长并且您想将其包装在下一行时,我讨厌 VB.NET 对我的代码的“控制”重新调整。 C# 做了一点,但我发现它在 C# 中更有用,而在 VB 中,它更具控制性。但这更多的是 VB.NET IDE 与 C# IDE,而不是语言本身。但我不知道您是想要两者都想要还是纯粹想要没有 IDE 差异的语言功能。

5:我真正想念的是在 C# 中创建一个新的代码块,我可能在一个方法中发生了很多事情,我想在一个非常小的代码块中声明一个变量,但没有在外部声明该变量整个方法中的那个块。在 C# 中,我们可以用 '' 创建一个新块并用 '' 结束它。 VB 没有这样的功能,但最接近的匹配是无条件的“If True Then”和“End If”块。 (注意 2 个字符的 C# 与 18 个字符的 VB.NET 等价物……更多的 VB 输入。)

6:自增和减量运算符:++ 和 -- 如myVariable++++myVariable 或等效的减量版本。这非常方便......有时。这是我非常想念 C# 时的实际代码示例:

// C#:
while (txt.Length > x)

    thisChar = txt[x];
    if (charsAllowedWithoutLimit.Contains(thisChar))  ++x; 
    else if (allowLettersWithoutLimit && char.IsLetter(thisChar))  ++x; 
    else if ((x2 = charsAllowedWithLimit.IndexOf(thisChar)) >= 0)
    
        ++x; if (++usedCountA[x2] > charAllowedLimit[x2])  break; 
    
    else  break; 


' VB.NET:
While (txt.Length > x)
    thisChar = txt(x)
    If (charsAllowedWithoutLimit.Contains(thisChar)) Then
        x += 1
    ElseIf (allowLettersWithoutLimit AndAlso Char.IsLetter(thisChar)) Then
        x += 1
    Else
        x2 = charsAllowedWithLimit.IndexOf(thisChar)
        If (x2 >= 0) Then
            x += 1
            usedCountA(x2) += 1S
            If usedCountA(x2) > charAllowedLimit(x2) Then Exit While
        Else
            Exit While
        End If
    End If
End While

为了给出一个 C# 规则的非常好的例子,这是我最近亲自编写的更多代码:

// C#
public static bool IsNotWithin(this Byte   v, Byte   v1, Byte   v2)  return (v1 > v && v < v2) || (v2 < v && v > v1); 
public static bool IsNotWithin(this SByte  v, SByte  v1, SByte  v2)  return (v1 > v && v < v2) || (v2 < v && v > v1); 
public static bool IsNotWithin(this Int16  v, Int16  v1, Int16  v2)  return (v1 > v && v < v2) || (v2 < v && v > v1); 
public static bool IsNotWithin(this Int32  v, Int32  v1, Int32  v2)  return (v1 > v && v < v2) || (v2 < v && v > v1); 
public static bool IsNotWithin(this Int64  v, Int64  v1, Int64  v2)  return (v1 > v && v < v2) || (v2 < v && v > v1); 
public static bool IsNotWithin(this UInt16 v, UInt16 v1, UInt16 v2)  return (v1 > v && v < v2) || (v2 < v && v > v1); 
public static bool IsNotWithin(this UInt32 v, UInt32 v1, UInt32 v2)  return (v1 > v && v < v2) || (v2 < v && v > v1); 
public static bool IsNotWithin(this UInt64 v, UInt64 v1, UInt64 v2)  return (v1 > v && v < v2) || (v2 < v && v > v1); 
public static bool IsNotWithin(this Decimal v, Decimal v1, Decimal v2)  return (v1 > v && v < v2) || (v2 < v && v > v1); 

public static bool IsWithin(this Byte   v, Byte   v1, Byte   v2)  return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); 
public static bool IsWithin(this SByte  v, SByte  v1, SByte  v2)  return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); 
public static bool IsWithin(this Int16  v, Int16  v1, Int16  v2)  return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); 
public static bool IsWithin(this Int32  v, Int32  v1, Int32  v2)  return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); 
public static bool IsWithin(this Int64  v, Int64  v1, Int64  v2)  return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); 
public static bool IsWithin(this UInt16 v, UInt16 v1, UInt16 v2)  return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); 
public static bool IsWithin(this UInt32 v, UInt32 v1, UInt32 v2)  return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); 
public static bool IsWithin(this UInt64 v, UInt64 v1, UInt64 v2)  return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); 
public static bool IsWithin(this Decimal v, Decimal v1, Decimal v2)  return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); 

' And the VB equivalent is a mess! Here goes:
<Extension()>
Public Function IsNotWithin(v As Byte, value1 As Byte, value2 As Byte) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As SByte, value1 As SByte, value2 As SByte) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As Int16, value1 As Int16, value2 As Int16) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

' the % suffix means 'As Integer' in VB.
<Extension()>
Public Function IsNotWithin(v%, value1%, value2%) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

' the & suffix means 'As Long' in VB.
<Extension()>
Public Function IsNotWithin(v&, value1&, value2&) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As UInt16, value1 As UInt16, value2 As UInt16) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As UInt32, value1 As UInt32, value2 As UInt32) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As UInt64, value1 As UInt64, value2 As UInt64) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

' the @ suffix means 'As Decimal' in VB.
<Extension()>
Public Function IsNotWithin(v@, value1@, value2@) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsWithin(v As Byte, value1 As Byte, value2 As Byte) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As SByte, value1 As SByte, value2 As SByte) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As Int16, value1 As Int16, value2 As Int16) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

' the % suffix means 'As Integer' in VB.
<Extension()>
Public Function IsWithin(v%, value1%, value2%) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

' the & suffix means 'As Long' in VB.
<Extension()>
Public Function IsWithin(v&, value1&, value2&) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As UInt16, value1 As UInt16, value2 As UInt16) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As UInt32, value1 As UInt32, value2 As UInt32) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As UInt64, value1 As UInt64, value2 As UInt64) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

' the @ suffix means 'As Decimal' in VB.
<Extension()>
Public Function IsWithin(v@, value1@, value2@) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

也许这是 C# 更简洁的充分证据。但并不是所有的程序员都喜欢简洁。有些人更喜欢读“if a

我还认为需要在 VB 中的字符文字后使用 'c' 以使其成为字符文字而不是字符串很烦人。我更喜欢 C# 的简洁性。当一个方法需要一个字符文字时,你需要提供一个字符而不是一个字符长度的字符串,所以有时你不得不在VB中使用":"c,而在C#中它是':'。我认为这是挑剔的。

说句公道话,我会说我喜欢 VB 的优点是不必在方法调用后放置空括号,例如 Dim nameUpper$ = name.ToUpperInvariant,其中 C# 需要空括号:string nameUpper = name.ToUpperInvariant()。或者像修剪它一样加倍:Dim nameUpper$ = name.Trim.ToUpperInvariant vs string nameUpper = name.Trim().ToUpperInvariant()。我喜欢 VB 简洁地使用我刚刚使用上面的$ 将其调暗为“作为字符串”,而 C# 没有这些快捷方式。 VB 有 String、Integer、Long、Decimal、Single 和 Double 类型的快捷键,但缺点是不太清楚,所以我谨慎使用。不过,我更喜欢简洁的代码。

嗯,这只是这位经验丰富的程序员的一些想法,而且我认为,这是我对 C# 与 VB 的编程“见证”。在我看来,两者都是不错的语言。但是是的,我还是更喜欢 C#。

附言由于我打算在我的大部分时间里编程,我什至重新学会了使用最高效的键盘打字:Dvorak 键盘,与 Qwerty 键盘相比,键入英语所需的精力大约是 1/3。查一下。也许你也想切换。 ;) 它让我的打字轻松了 67%! :) 我鼓励任何人跳出框框思考并评估您工作中的更高效率。 Dvorak Simplified Keyboard Layout 和 C# 为我完成了这项工作。 :)

附言我会将 Dvorak 和 C# 与公制进行比较,而不是将 Qwerty 键盘布局和 VB 与 Empirial 测量进行比较。 Dvorak、metric 和 C# 只是“干净”。但是 VB 并没有真正落后。但它确实需要向后兼容旧的 VB6 代码和 .NET 之前的代码,例如“Or”与“OrElse”和“IIF()”。

我谨慎结束。请更加谨慎,不要听那些不知道他们在说什么的人。对 VB 和 C# 的所有缺点中,有一半不再有任何问题,而且人们仍然发帖说他们不知道语言中仍然存在哪些缺点。我能想到的最好的例子是 XML cmets,用于在 VB 中使用三撇号或在 C# 中使用三斜杠注释符号的方法。但是请您自己辨别一个人是出于无知,还是出于经验。个人见证意味着他们从他们的真实经历中知道。在有人对此有很多经验之后,请竖起耳朵。我在 C# 和 VB 方面都有超过 10 年的经验。归结为:两者都是(非常)好的语言。而大部分差异,你可以在阅读代码的 5 分钟内立即看到。但是,是的,其他功能可能需要数年才能找到障碍。我知道的一个障碍(在 C# 中),我什至想不出在现实生活中它会有用的情况。所以也许这毕竟不是一个障碍。

编码愉快!

【讨论】:

我很欣赏所有的细节,但你的例子没有使用区分大小写/不区分大小写(据我所知)来说明为什么 C# 在某种程度上“更好”。 我试着用一个直接的例子来回答第二个问题。 @ToddMain,正确。而且我的示例没有使用区分大小写来显示 why C# 更好,因为问题没有问 why 区分大小写会使它变得更好。此外,我相信这个功能不言自明。而且我相信逻辑是基本的,大多数人可以自己推断出来。但如果有人问起,我很乐意帮助他们了解逻辑。但是,我的朋友,在我看来,这是一个不同的问题。 ;) 实际上,这是原帖中提出的两个问题之一。这不是不言而喻的,这就是我问的原因。但不用担心不解决这个问题。 @ToddMain,我明白你的意思。确实很公平。 :) 感谢您对此大开眼界。 :)【参考方案14】:

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

所有这些代码都会抛出 COMPILE-TIME ERROR

对于第一个示例,将显示错误,说“局部变量'A'已在当前块中声明。”。

对于第二个和第三个示例,将显示错误消息“'Public Sub b()' has multiple definition with same signatures”。和“'Public Function c() As Integer' 有多个具有相同签名的定义。”,分别。

从这些错误中,请注意这些错误在变量和过程/函数的不同位置引发。对于变量,在第二次声明时会抛出错误,而对于过程/函数,在相同代码的第一次声明/定义时会抛出错误。

正如用户在上面某处的评论中所说,VB.NET 代码在后台不断检查和/或更正;您可以在 VS IDE 的“错误列表”窗口中看到此错误。由于这是一个错误不是警告,代码在错误解决之前不会编译。

【讨论】:

以上是关于VB真的不区分大小写吗?的主要内容,如果未能解决你的问题,请参考以下文章

mysql常用命令区分大小写吗

oracle11g中的sql语句区分大小写吗

mysql区分表名区分大小写吗

在运行时与 VB.NET LIKE 运算符进行大小写(不)敏感比较(无选项比较)

oracle数据库区分大小写吗?

oracle数据库区分大小写吗?