在VB.NET中使用Dim foo As Foo有什么问题吗?

在最近的VB.NET项目中,我采用了我习惯在C#中使用的命名约定。 也就是说,经常调用与它引用的类相同的变量,只有不同的情况,例如

Foo foo = new Foo(); // C# Dim foo As New Foo() ' VB.NET 

我发现这通常是编写代码的最清晰的方法,特别是对于小方法。 这种编码风格显然在C#中运行良好,区分大小写,并且由于Visual Studio提供的语法高亮,很容易看出类名和变量名是不同的。

然而,令我惊讶的是,在VB.NET中,这几乎在100%的时间内也能正常工作。 唯一的问题是变量名称似乎具有多重身份。 即它可以用于调用Foo类的实例方法和共享(静态)方法。 这并没有真正引起任何问题,只是意味着Intellisense会在你点击”后提供包含静态和实例方法的列表。 变量名后面。

我再次惊讶地发现,这实际上并没有导致我的项目出现任何混乱,到目前为止它已经非常成功! 但是,我是唯一一个从事这个特定​​项目的人。

这是一个稍长的例子:

 Dim collection as Collection = New Collection() For Each bar As Bar in Bar.All() collection.SomeInstanceMethod(bar) Next collection.SomeSharedMethod() 

*我发现的唯一问题是,有时候’重命名’重构工具会混淆,即重命名一个类时,它会重命名与类同名的变量,在它们的声明行中( Dim foo As... ),但不是对该变量的其他引用,导致编译器问题(duh)。 这些总是很容易纠正。

另一个小麻烦是VB.NET语法高亮显示器不会突出显示类名,而不是变量名,这使得它不如在C#中使用它时那么好。 我仍然发现代码非常易读。

还有其他人试图在团队环境中允许这个吗? 在VB.NET中这个命名约定还有其他潜在的问题吗?

我将在这里与其他答案不同……我认为这样做没有任何问题。 我经常这样做,并且完全没有问题。

如果对变量名使用小写,则可以轻松地将变量与类型区分开来,编译器不会混淆这两个标识符。

如果删除变量声明,编译器会认为对此变量的其他引用现在引用了类型,但它并不是真正的问题,因为它们将被标记为错误。

虽然VB不区分大小写,但编译器足够智能,不会在对象实例和类之间混淆。

但是,在不区分大小写的语言中使用相同的名称肯定是非常危险和错误的! 特别是如果其他程序员正在从事该项目。

我必须在VB和C#之间来回移动,我们认为这种做法很糟糕。 我们也不喜欢让C#中的变量名与它们的类型区别开来。 相反,我们使用_前缀或给它一个更有意义的名称。

每当你开始一种新语言时,你就会注意到一堆不同的东西,并且错过旧的做事方式。 通常这是因为您最初没有意识到其他语言中的不同function可以解决同样的问题。 由于您是VB的新手,以下是一些可以帮助您完成工作的笔记:

说VB.Net不区分大小写并不是100%正确,除非你也指出它是区分大小写的 。 当您声明变量标识符时,IDE将记录您使用的情况并自动更正其他用途以匹配该情况。 您可以使用此function来帮助发现拼写错误或IDE可能会对变量或类型混淆的位置。 我实际上更喜欢这个实际的区分大小写的方案。

VB.Net以不同方式导入名称空间。 如果你想使用File类,你可以说IO.File而不需要在顶部导入System.IO 。 在学习具有一些嵌套命名空间层的新API时,该function特别有用,因为您可以导入API的顶级部分,键入下一个命名空间名称,并且系统会提示您输入该命名空间中的类列表。 这里很难解释,但是如果你寻找它并开始使用它,那么回到C#时你会非常想念它。 最重要的是,至少对我来说,它真的打破我的流程需要跳转到文件的顶部为命名空间添加另一个using指令我可能只使用一次或两次。 在VB中,这种中断不太常见。

VB.Net进行后台编译。 光标离开一行时,您知道该行是否编译。 这有点弥补了不突出显示类名,因为在C#中有用的部分原因是你知道你正确输入了它。 VB.Net让您在这方面更有信心。

我过去也做过同样的事情。 我开始摆脱它,因为Visual Studio在自动格式化代码时会偶尔会感到困惑,并且会将我的静态方法调用的大小写更改为小写。 这比仅仅通过大小写来区分变量和类名更令人讨厌。 但是,纯粹从技术角度来看,它不应该引起任何问题。

正如Moayad所指出的那样,编译器可以说出不同之处 – 但这可能会导致维护问题和其他副作用。

全面的更好的做法是尝试在它们被使用的上下文中命名变量,而不仅仅是类型名称。 这导致自我记录代码并且需要更少的评论(评论被大量滥用作为编写密集代码的借口)。

它只是安全的,只要编译器总是可以判断Foo是表示类还是变量,最终你会遇到它不能的情况。 Eric Lippert 在他的博客中讨论了可能出错的事情。

我一直使用这个约定,这从来都不是问题。 变量最自然的名称通常是类名,因此你应该称之为它(任意Line?行的最佳名称)。

唯一的缺点是某些工具错误地解释了上下文。 例如,visual studio 2010 beta 1有时会在名为与类相同的变量上使用类突出显示。 这有点烦人。

上下文敏感度更接近我的想法而不是区分大小写。

嗯,这不是最终的答案,我认为没有确定的答案,但一般意见似乎是使用这个命名约定不是一个好主意! 必须有一种真正的方法来编写漂亮的VB.NET变量名称,而且我不喜欢任何替代方案……

以下是任何感兴趣的人的微软官方指南的链接,虽然他们似乎没有涵盖这个特定的问题(如果我错过了,请纠正我)。

Visual Basic命名约定: http : //msdn.microsoft.com/en-us/library/0b283bse.aspx

声明的元素名称: http : //msdn.microsoft.com/en-us/library/81ed9a62.aspx

干得好!

VB.NET不区分大小写! 这相当于:

 Foo Foo = new Foo(); // C# 

作为我们团队环境的标准,我们将使用:

 Dim oFoo as New Foo 'VB.NET