124

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

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

Dim ss As String
Dim SS As String

...进入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#?
4

14 回答 14

110

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

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

我认为您对引擎盖下的内容感兴趣。嗯,.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 提供不区分大小写的程度。

于 2010-02-20T11:17:23.410 回答
22

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

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

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

但是,这种行为纯粹是作为用户增值完成的。它不是核心语言的一部分。

于 2010-02-20T19:30:15.340 回答
16

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

于 2010-02-20T04:55:11.247 回答
9

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

要使两个标识符被认为是不同的,它们的区别必须不仅仅在于它们的大小写。

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

于 2010-02-20T12:10:26.850 回答
7

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

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

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

旁注:

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

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

于 2011-07-29T17:22:13.423 回答
5

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

请查看 VB.NET 基础教程以获取更多信息 :)

于 2010-02-20T04:05:50.463 回答
3

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

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

于 2010-02-20T04:06:31.783 回答
1

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

于 2010-02-20T04:07:15.153 回答
1

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

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

于 2010-07-14T21:56:38.333 回答
1

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

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

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

于 2013-05-17T14:36:24.600 回答
1

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

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

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

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

现在尝试用 VB(任何版本)创建一个 WSDL。它会说“电子邮件”已经被声明并且 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

于 2013-09-27T14:15:46.290 回答
1

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

这是一个例子

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
于 2018-09-10T13:04:51.257 回答
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

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

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

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

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

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

于 2012-10-05T07:54:30.493 回答
0

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

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

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

当 C# 第一次出现时,VB 没有可以放在方法之前的 XML 注释,而我在 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没有多行注释。当我使用 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++or++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 < b then ...”,因为这对他们的人类语言来说更自然。这很好。偏好很好。对我来说,手工是我看重的一个因素,我认为任何人都可以习惯于用他们喜欢的任何符号来思考,因为“if”和“then”是字母表的符号,而 C# 的“if(条件)语句”;语法也是符号。一个比另一个更接近非程序员的语法。我更喜欢简洁的。

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

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

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

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

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

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

快乐编码!

于 2014-01-24T22:31:53.990 回答