Visual Basic 是否曾像 C90 那样限制变量的声明位置?
Did Visual Basic ever restrict where variables could be declared like C90?
忙于旧的 VB6 项目,最近转换为 VB.NET。该应用程序最初是在 1990 年代编写的,所有变量声明(Dim dbVersion As Single
等)都挤在方法的顶部,通常在使用变量的地方看不到。
“在函数顶部声明所有变量”的风格在 90 年代很普遍,在 C 语言的 C90 和更早的 K&R 版本中强制执行。一些语言,例如 Delphi,仍然使用这种声明式风格。但是 C99 和后来的 C 标准、C++、C# 和现代 VB.NET 允许在使用变量的任何地方声明变量(IMO,一个巨大的改进)。
我的问题是,这种风格是否曾经在 Visual Basic 或 VBA(或者确实是 VB.NET)中强制实施过?
建议,作为“最佳实践”在学校教授,但不,编译器不强制执行——没有达到声明必须 出现在过程范围内任何可执行语句之前,没有。
VB6/VBA 代码可以在过程范围内的任何地方声明局部变量(VB6/VBA 中的最小可能范围);问题是 Dim
(和 Const
,在本地范围内也是合法的)语句不可执行(你不能破坏它们),我猜它被如此热烈推荐的原因“将它们全部放在顶部”是局部声明必须出现在第一次使用变量之前:声明块因此确保所有局部声明都是合法的。
Caveat: ReDim
statements are executable, and they act as a Dim
declaration. It is perfectly legal to have ReDim someArray(1 To maxValue)
even if someArray
wasn't previously declared, even with Option Explicit
specified.
但是在过程顶部有一个声明块并不是现代最佳实践...
[...] are crammed together at the top of methods, generally out-of-sight from where the variable is used.
...IMO 这 正是原因。
VB.NET 稍微改变了作用域规则(你现在可以在过程中有一个内部作用域),但它 所做的是引入一个知识差距足够小以至于 VB6 开发人员不会被吓到,但又足够宽以至于新的语言和框架可以拥有一套新的最佳实践——并且入职开发人员会接受它们。新语言,新方法:在过程范围顶部使用匈牙利表示法和声明墙 - 就像那样,新建议是在需要时声明变量,并且永远不要在任何标识符前加上类型缩写.
但是 VBA 人群中的大部分人都不是开发人员,也没有跳上 .NET 的潮流,并且基本上错过了可以有效应用于 [=46= 的更新最佳实践的备忘录] 尽管他们被推到了 VB.NET。 VBA/VB6 不一定停留在 1997 年; Rubberduck 项目(开源,我管理它)旨在使 VBE 及其工具(静态代码分析、重构、单元测试等)以及围绕它的编码实践现代化。
忙于旧的 VB6 项目,最近转换为 VB.NET。该应用程序最初是在 1990 年代编写的,所有变量声明(Dim dbVersion As Single
等)都挤在方法的顶部,通常在使用变量的地方看不到。
“在函数顶部声明所有变量”的风格在 90 年代很普遍,在 C 语言的 C90 和更早的 K&R 版本中强制执行。一些语言,例如 Delphi,仍然使用这种声明式风格。但是 C99 和后来的 C 标准、C++、C# 和现代 VB.NET 允许在使用变量的任何地方声明变量(IMO,一个巨大的改进)。
我的问题是,这种风格是否曾经在 Visual Basic 或 VBA(或者确实是 VB.NET)中强制实施过?
建议,作为“最佳实践”在学校教授,但不,编译器不强制执行——没有达到声明必须 出现在过程范围内任何可执行语句之前,没有。
VB6/VBA 代码可以在过程范围内的任何地方声明局部变量(VB6/VBA 中的最小可能范围);问题是 Dim
(和 Const
,在本地范围内也是合法的)语句不可执行(你不能破坏它们),我猜它被如此热烈推荐的原因“将它们全部放在顶部”是局部声明必须出现在第一次使用变量之前:声明块因此确保所有局部声明都是合法的。
Caveat:
ReDim
statements are executable, and they act as aDim
declaration. It is perfectly legal to haveReDim someArray(1 To maxValue)
even ifsomeArray
wasn't previously declared, even withOption Explicit
specified.
但是在过程顶部有一个声明块并不是现代最佳实践...
[...] are crammed together at the top of methods, generally out-of-sight from where the variable is used.
...IMO 这 正是原因。
VB.NET 稍微改变了作用域规则(你现在可以在过程中有一个内部作用域),但它 所做的是引入一个知识差距足够小以至于 VB6 开发人员不会被吓到,但又足够宽以至于新的语言和框架可以拥有一套新的最佳实践——并且入职开发人员会接受它们。新语言,新方法:在过程范围顶部使用匈牙利表示法和声明墙 - 就像那样,新建议是在需要时声明变量,并且永远不要在任何标识符前加上类型缩写.
但是 VBA 人群中的大部分人都不是开发人员,也没有跳上 .NET 的潮流,并且基本上错过了可以有效应用于 [=46= 的更新最佳实践的备忘录] 尽管他们被推到了 VB.NET。 VBA/VB6 不一定停留在 1997 年; Rubberduck 项目(开源,我管理它)旨在使 VBE 及其工具(静态代码分析、重构、单元测试等)以及围绕它的编码实践现代化。