【问题标题】:VB.NET not case sensitive; well sort of case-sensitive?VB.NET 不区分大小写;很好区分大小写?
【发布时间】:2012-12-01 03:20:53
【问题描述】:

C# 可以这样:

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

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

如果我尝试执行以下操作,VS 会抱怨 VB.NET。事实上,它甚至不允许我用小写 tReturn 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.Net 会编译为 CLR 并且 CLR 是区分大小写的,但是 VS IDE 在 bg 中编译并将“自动转换”为相同的大小写。 stackoverflow.com/questions/2300983/…
  • “实际上”C# 和 VB.NET 被编译为相同的代码。顺便说一句,如果编译器允许您的第一个 sn-p,您将产生一个 无限循环。为了防止您这样做,它不允许在 VB 中使用它(也是因为 VB.NET 开发人员希望 VB 不区分大小写)。
  • 您可以在 C# 中编写一个库,然后在 VB.Net 中引用它。我相信引起混乱的事情会被[]“引用”。 (例如,Shared 是 VB.Net 中的保留字,因此您需要将 [Shared] 用于变量/字段/标识符)
  • 你可以在VB中使用_total

标签: c# vb.net visual-studio-2010


【解决方案1】:

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

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

【讨论】:

  • +1..."inconsistency" 绝对是错误的词——我已经编辑了 OP
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

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

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

    【讨论】:

    • 如果 VS 将所有 VB.NET 命令更改为大写或小写,那将是一致的;一个或另一个,但不是正确的 - 也许我只是一个书呆子?
    • @whytheq 我不明白为什么 VB 应该这样做。当你写文本时,你可能也会用正确的大小写,在适当的情况下在大写和小写之间交替,并且仍然希望其他人能够阅读,对吗?正确的拼写比全部大写或全部小写更具可读性。
    • @KonradRudolph ....ok 同意(尽管我们可以回到 C# 并询问为什么 VS 不显示所有 C# 在适当的情况下,如果这使事情更具可读性);感谢您对此的帮助;我想我只需要接受苹果和梨是不同的。
    【解决方案4】:

    有几点需要解决:

    • 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 的自动更正功能,您仍然会引用该属性,因为它不区分大小写。

    【讨论】:

    • +1 感谢罗尔夫;我只需要接受差异并继续前进
    【解决方案5】:

    实际上,这里的问题与名为 '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 代码中真正发生的事情变得非常令人沮丧。

    【讨论】:

      猜你喜欢
      • 2013-03-06
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 2016-11-24
      • 2011-03-08
      • 1970-01-01
      相关资源
      最近更新 更多