1

这没关系C#

private int total;
public int Total {
    get {
        return total;
    }
}

因此,支持字段total的拼写与 the 相同,Property Total唯一能区分它们的是T.

VB.NET如果我尝试执行以下操作,VS 会抱怨。事实上,它甚至不会让我Return total用小写字母书写t并自动更正为大写字母T

在此处输入图像描述

但是,如果我以不同的方式拼写支持字段,那么它似乎没问题:

Private fTotal As Integer
Public ReadOnly Property Total() As Integer
    Get
        Return fTotal
    End Get
End Property

我意识到它们是不同的语言,但这种差异背后是否有合乎逻辑的原因?(编辑最初说“明显的不一致”而不是“差异”)

另外 - 我假设即使 Visual Studio 自动更正了我的 VB.NET 的大小写,但实际上这种语言不区分大小写?

4

5 回答 5

5

我意识到它们是不同的语言,但这种明显的不一致背后是否有合理的原因?

最初的原因只是历史原因:VB 基于 BASIC,与当时的其他语言 (FORTRAN) 一样,它不区分大小写(但通常以全大写形式编写)。

此外,我没有看到任何不一致之处:在 VB 内部,大小写是完全一致的。特别是,它不像您的标题所要求的那样“区分大小写”。

即使在今天,也有区分大小写的逻辑原因:由于名称冲突,这使得引入错误变得更加困难;考虑以下 C# 代码:

private int total;

public int Total {
    get { return total; }
    set { Total = value; }
}

您是否立即发现了错误?如果是这样,还不错(这里的语法高亮有帮助)。在 VB 中,此类错误不会发生。但在实践中,我认为这类错误并不是那么成问题,因为一旦发现它们就很容易消除。因此,虽然这是不区分大小写的一个原因,但它并不是一个非常强大的原因。

最后,请注意 Windows 和 OS X 文件系统在此处使用与 VB 相同的约定:文件系统不区分大小写(文件名大小写无关紧要)但区分大小写——这意味着文件系统保留文件名的原始大小写并显示它正确,但在比较时,它不考虑大小写。

于 2012-12-13T09:23:08.090 回答
1

有几点需要解决:

  • Visual Basic 语言始终不区分大小写。编译器不在乎您是否以一种方式声明变量并以另一种方式使用它。

  • IDE (Visual Studio) 将有助于修复变量使用情况以匹配实际声明。您也许可以在设置中将其关闭,但我从未尝试过,所以我不知道它是否真的可能。

现在回到你的代码:

Private total As Integer
Public ReadOnly Property Total() As Integer
    Get
        Return Total
    End Get
End Property

这里实际上有两个错误:

  1. 您有两个同名成员,一个名为 的字段total和一个名为 的属性Total。它们的名称相同,因为它们的比较不区分大小写(编译器会为此显示错误 - 屏幕截图中的蓝色波浪线)。

  2. IDE 自动将属性内的“总计”更正为“总计”,因为您实际上指的是属性,而不是字段。编译器不会因此向您显示错误,但如果您要删除该字段(以便您的程序编译),您将在运行时遇到堆栈溢出,因为该属性会调用自身。请注意,即使您确实设法打开了 IDE 的自动更正功能,您仍然会引用该属性,因为它的查找不区分大小写。

于 2012-12-13T11:12:37.523 回答
1

VB.NET 不区分大小写,它的设计目的是让 Visual Basic 程序员易于学习,并且与 Visual Basic 共享此特性。

C# 区分大小写,它是与 VB.NET 不同的语言。即使它们都用于 .NET 开发,它们也不必保持一致。您可以使用多种语言进行 .NET 开发,这些语言之间的差异很多,并且不限于区分大小写。

于 2012-12-13T09:11:22.640 回答
0

到目前为止,VB.Net 编译器是不区分大小写的,因此出于所有意图和目的,它禁止使用具有相同名称且只有大写或小写字母不同的字段。

底层 CLI(公共语言接口)和 CLR(公共语言运行时)确实支持大小写差异。但是,给出的 c# 示例不是 CLS 有效的。

于 2012-12-13T09:12:58.990 回答
0

实际上,这里的问题与名为“total”的不同案例字段无关。如果删除该字段,您会看到同样的问题。

问题是 VB 允许您通过与属性或函数同名的隐藏局部变量来选择设置要由属性或函数返回的值,然后返回该隐藏变量。

e.g., this will work:
Public ReadOnly Property Total() As Integer
    Get
        Total = 3  'setting the hidden VB variable
        Return Total 'returning the hidden VB variable
    End Get
End Property

在这种情况下,VB 甚至允许省略 return 语句:

Public ReadOnly Property Total() As Integer
    Get
        Total = 3  'setting the hidden VB variable
    End Get 'since the hidden VB variable was set, it is returned implicitly
End Property

这些类型的 VB 主义可以让解释 VB 代码中真正发生的事情变得非常令人沮丧。

于 2012-12-13T15:04:58.340 回答