关于c#:VB.NET不区分大小写;

VB.NET not case sensitive; well sort of case-sensitive?

这在C#中是可以的:

1
2
3
4
5
6
private int total;
public int Total {
    get {
        return total;
    }
}

所以背场total的拼写与Propertytotal的拼写相同,唯一区别的是T的情况。

如果我尝试做以下的事情,VB.NETvs会抱怨。实际上,它甚至不允许我用小写的TReturn total,自动更正为大写的T

enter image description here

但是,如果我用不同的方式拼写后援字段,那么似乎没问题:

1
2
3
4
5
6
Private fTotal As Integer
Public ReadOnly Property Total() As Integer
    Get
        Return fTotal
    End Get
End Property

我知道它们是不同的语言,但这种差异背后有逻辑原因吗?(编辑最初称为"明显不一致",而不是"差异")。

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


I realize they are different languages but is there a logical reason behind this apparent inconsistency?

最初的原因很简单:vb是基于基本语言的,和当时的其他语言(fortran)一样,基本语言不区分大小写(但通常都是大写的)。

此外,我没有看到任何不一致之处:在VB中,外壳是完全一致的。尤其是,它不像你的标题所要求的那样"区分大小写"。

即使在今天,也有一个不区分大小写的逻辑原因:由于名称冲突,很难引入错误;请考虑以下C代码:

1
2
3
4
5
6
private int total;

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

你立即发现错误了吗?如果是的话,还不错(这里突出显示的语法有帮助)。在VB中,此类错误不会发生。但在实践中,我认为这类bug并不是所有的问题,因为一旦识别出来,它们就很容易被消除。所以,虽然这是案件不敏感的原因,但它不是一个很强的原因。

最后,请注意,Windows和OS X文件系统在这里使用与vb相同的约定:文件系统不区分大小写(文件名大小写不重要),但区分大小写––意味着文件系统保留文件名的原始大小写并正确显示,但在比较时,确实如此ESN不考虑案例。


有几点需要解决:

  • 语言VisualBasic总是不区分大小写。编译器不关心您是否以某种方式声明变量并使用另一种方法。

  • IDE(Visual Studio)将帮助修复变量用法的情况,以匹配实际声明。您可以在"设置"中关闭此功能,但我从未尝试过,因此我不知道它是否实际可行。

现在回到你的代码:

1
2
3
4
5
6
Private total As Integer
Public ReadOnly Property Total() As Integer
    Get
        Return Total
    End Get
End Property

这里实际上有两个错误:

  • 您有两个同名的成员,一个名为total的字段和一个名为total的属性。它们是相同的名称,因为它们是不敏感的大小写比较(编译器显示了一个错误——屏幕截图中的蓝色曲线)。

  • IDE会自动将属性中的"total"更正为"total",因为实际上您引用的是属性,而不是字段。编译器不会因此向您显示错误,但如果要删除字段(以便您的程序编译),您将在运行时遇到堆栈溢出,因为该属性将调用自身。请注意,即使您成功地打开了IDE的"自动更正",您仍然会引用该属性,因为它是不敏感地查找大小写的。


  • vb.net不区分大小写,它被设计为便于VisualBasic程序员学习,并与VisualBasic共享这一特性。

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


    实际上,这里的问题与名为"total"的不同case字段无关。如果删除该字段,您将看到相同的问题。

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

    1
    2
    3
    4
    5
    6
    7
    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甚至允许省略返回语句:

    1
    2
    3
    4
    5
    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 ISMS会使解释在VB代码中实际发生的事情非常令人沮丧。


    到目前为止,vb.net编译器不区分大小写,因此出于所有目的和目的,它禁止使用同名字段,并且只允许使用大写或小写字母。

    基础的cli(公共语言接口)和clr(公共语言运行库)确实支持大小写差异。但是,给出的C示例不是有效的CLS。