[英]VB.NET not case sensitive; well sort of case-sensitive?
在C#
没关系:
private int total;
public int Total {
get {
return total;
}
}
因此,后备字段total
的拼写与Property
Total
拼写相同,唯一的区别是T
的情况。
如果我尝试执行以下操作,则使用VB.NET
VS会抱怨。 实际上,它甚至都不会让我用小写的t
写出Return total
并自动将大写的T
改正为
但是,如果我对后备字段的拼写不同,那么似乎没问题:
Private fTotal As Integer
Public ReadOnly Property Total() As Integer
Get
Return fTotal
End Get
End Property
我意识到它们是不同的语言,但是这种差异背后是否存在逻辑原因? ( EDIT最初说的是“表观不一致”,而不是“差异”)
另外-我假设即使Visual Studio自动更正了VB.NET的大小写,但实际上这种语言不区分大小写?
我意识到它们是不同的语言,但是这种明显的不一致背后有逻辑上的原因吗?
最初的原因仅是历史原因:VB基于BASIC,与当时的其他语言(FORTRAN)一样,它不区分大小写(但通常是全大写)。
此外,我没有看到任何不一致的地方:在VB中,大小写是完全一致的。 特别是,它并不像标题所要求的那样“区分大小写”。
即使在今天,也有理由不区分大小写,这是合乎逻辑的原因:由于名称冲突,这使得引入错误更加困难; 考虑以下C#代码:
private int total;
public int Total {
get { return total; }
set { Total = value; }
}
您立即发现错误了吗? 如果是这样,还不错(这里的语法高亮有帮助)。 在VB中,不会发生此类错误。 但是实际上,我认为这类bug并不是所有问题,因为一旦发现它们就很容易消除。 因此,尽管这是不区分大小写的原因,但并不是一个很强的理由。
最后,请注意Windows和OS X文件系统在这里使用与VB相同的约定:文件系统不区分大小写(文件名不区分大小写),但区分大小写 –意味着文件系统保留文件名的原始大小写并显示它正确,但比较时不考虑大小写。
VB.NET不区分大小写,对于Visual Basic程序员来说,它易于学习,并且与Visual Basic具有相同的特征。
C#区分大小写,它与VB.NET语言不同。 即使它们都用于.NET开发, 也不必保持一致 。 您可以使用多种语言进行.NET开发,并且这些语言之间的差异很多,并且不仅限于区分大小写。
有几点要解决:
Visual Basic语言始终不区分大小写。 编译器不在乎是否以一种方式声明变量并以另一种方式使用它。
IDE(Visual Studio)将有助于修正变量用法的大小写,以匹配实际的声明。 您也许可以在设置中将其关闭,但是我从未尝试过,所以我不知道它是否确实可行。
现在回到您的代码:
Private total As Integer
Public ReadOnly Property Total() As Integer
Get
Return Total
End Get
End Property
实际上,这里有两个错误:
您有两个具有相同名称的成员,一个名为total
的字段和一个名为Total
的属性。 它们是相同的名称,因为它们不区分大小写地进行比较(编译器为此显示一个错误-屏幕截图中的蓝色波浪线)。
IDE会自动将属性内的“总计”校正为“总计”,因为您实际上是在引用属性,而不是字段。 因此,编译器不会向您显示错误,但是,如果要删除该字段(以便您的程序进行编译),则在运行时会遇到堆栈溢出,因为该属性会自行调用。 请注意,即使您设法打开了IDE的自动更正功能,您仍然会引用该属性,因为它是不区分大小写地查找的。
到目前为止,VB.Net编译器不区分大小写,因此出于所有意图和目的,它禁止使用具有相同名称的字段,并且只区分大小写字母。
底层的CLI(公共语言界面)和CLR(公共语言运行时)确实支持区分大小写。 但是,给出的c#示例不是CLS有效的。
实际上,这里的问题与名为“ total”的不同case字段无关。 如果删除该字段,则会看到相同的问题。
问题在于,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代码中实际发生的事情变得非常令人沮丧。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.