2012-12-13 286 views
0

这是确定在C#VB.NET不区分大小写;很好的区分大小写?

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

所以支持字段total拼写一样PropertyTotal与唯一告诉他们除了作为T的情况。

随着VB.NET VS抱怨,如果我试图做到以下几点。事实上,它甚至不会让我写Return total以小写t,并自动校正成一个大写T

enter image description here

但是,如果我拼写支持字段不同则似乎是确定:

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

我意识到他们是不同的语言,但这背后有一个合乎逻辑的理由吗? (编辑最初说“明显不一致”而不是“差异”)

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

+0

看看这个http://stackoverflow.com/questions/2300983/is-vb-really-case-insensitive – V4Vendetta

+1

实际上,VB.Net将编译为CLR,而CLR区分大小写,但VS IDE在bg中编译并将“自动转换”成为相同的情况。 http://stackoverflow.com/questions/2300983/is-vb-really-case-insensitive –

+0

“实际上”C#和VB.NET编译为相同的代码。顺便说一句,如果编译器会允许你的第一个片段,你会产生**无限循环**。为了防止你这样做,它不允许它在VB中(也因为VB.NET开发人员期望VB不区分大小写)。 –

回答

4

我意识到他们是不同的语言,但是在这种明显的不一致性背后有逻辑原因吗?

最初的原因很简单:VB基于BASIC,与当时其他语言(FORTRAN)不区分大小写(但通常用大写字母写)。此外,我没有看到任何不一致:在VB内部,套管是完全一致的。特别是,当你的标题要求时,它不是“区分大小写”。

还有逻辑上的原因是不区分大小写,即使在今天:由于名称冲突导致错误更难;考虑以下C#代码:

private int total; 

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

您是否立即发现错误?如果是这样,不坏(这里的语法突出帮助)。在VB中,这类错误不会发生。但在实践中,我认为这类错误不是所有问题,因为一旦确定它们很容易被消除。所以虽然这是不区分大小写的原因,但并不是很强大。

最后,请注意Windows和OS X文件系统使用相同的约定在这里VB:文件系统不区分大小写(文件名不区分大小写),但情况下知道 - 这意味着文件系统会保留原来的外壳的文件名并正确显示,但比较时,不考虑大小写。

+0

如果VS将所有VB.NET命令改为大写或小写,一个或另一个,但不是适当的 - 也许我只是一个学生? – whytheq

+1

@whytheq我不明白为什么VB应该这样做。当你写文本的时候,你可能还会写适当的情况,适当地在大写字母和小写字母之间交替,并且仍然期望其他人能够阅读这些内容,对吗?恰当的拼写比所有大写或全部小写都更易读。 –

+0

@KonradRudolph .... ok同意(虽然我们可以回到C#并问为什么不显示所有的C#在正确的情况下,如果这使得事情更具可读性);感谢您的帮助;我想我只需要接受苹果和梨是不同的。 – whytheq

1

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

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

+0

+1 ...“不一致”绝对是错误的词 - I已经编辑了OP – whytheq

0

VB.Net编译器对于所有意图和目的都是不区分大小写的,因此它禁止使用具有相同名称和唯一区别大写或小写字母的字段。

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

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会自动将'total'更正为属性内的'Total'。编译器不会因此而向您显示错误,但如果您要删除该字段(以便编译程序),则会在运行时遇到堆栈溢出,因为该属性会自行调用。请注意,即使您确实设法关闭了IDE的自动更正功能,您仍然会引用该属性,因为它的大小写不敏感。

+0

+1谢谢Rolf;我只需要接受差异并继续前进 – whytheq

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代码真的发生了。