DefVar 是否有一个合法的用例?
Is there a single legitimate use case for DefVar?
Def[Type]
语句 从地狱中生成 在 VBA 中得到支持,似乎是为了强制执行某种 Systems Hungarian 符号。
例如:
Option Explicit
DefBool B
DefLng I, L
这些语句具有以下副作用:
Dim bSomething ' <~ that's a compile-time Boolean
Dim iGiveUp ' <~ that's a compile-time Long
Dim lNooooo ' <~ that's a compile-time Long also
并且:
Public Function IsUseful()
' function returns a compile-time Long
End Function
我们不要忘记:
Public Property Get BasicStuff()
' yep, that's a compile-time Boolean
End Property
你懂的。 Def[Type]
语句是血淋淋的邪恶,在现代代码中自愿使用它们应该通过键盘为您赢得 10K 伏电压*。
但是让我们敞开心扉,假装他们很棒一分钟。
有很多这样的说法:
DefBool
用于隐式类型 Boolean
DefCur
用于隐式类型 Currency
DefDbl
用于隐式类型 Double
DefInt
用于隐式类型 Integer
DefLng
用于隐式类型 Long
DefSng
用于隐式类型 Single
然后是这个:
DefVar
用于隐式类型 Variant
现在,如果你不知道,这也是一个隐式类型的变体:
Dim anything ' no "As [Type]" clause
因此给定隐式类型 Def[Type]
关键字可以 指定隐式编译时类型 给定一系列适用的首字母前缀...
DefVar V
Dim vSomeVariant ' compile-time Variant (DefVar)
Dim foo ' also a compile-time Variant (implicit)
Dim bar As Variant ' also a compile-time Variant (explicit)
Dim vRedundant As Long ' compile-time Long ("As [type]" clause overrides DefVar)
即使采用开放的、匈牙利系统友好的方法,我也无法理解 DefVar
的一个合法用例。有吗?
*您的里程数可能会有所不同。
编辑以反映现实 (-:
=====行之间的原始post
=================
也许有点做作,但是 DefVar
有一个合法的用例:覆盖另一个 DefXxx
。
假设您已经决定几乎所有的变量和函数都属于 Long
类型,因此您包含了语句:
DefLng A
等等,您还想为默认类型保留几个字母。这是通过以下方式完成的:
DefVar P
DefVar V
它比明确设置每个范围更短,可以说更清晰。
=================
经过评论和快速测试后,很明显这不再是真的,如果曾经是的话。不过,我认为我 post 接下来的内容确实显示了至少一个 DefXxx
语句的合理案例:
顺便说一句,我在每个 VB 代码模块前加上
Option Explicit
DefObj A-Z
这迫使我显式键入每个变量和函数,因为键入的几乎所有内容 As Obj
都不会作为公共变量存在...它会立即抛出一个错误说(例如)Abs(x)
,一个明确的迹象表明我忘记给 X 分配一个特定的类型。在不鼓励它的环境中强类型化。
Deftype 语句来自更旧版本的 BASIC。我记得至少在 QBasic 中,默认情况下变量是 floating-point,如果需要不同的变量,可以使用后缀。 (因此,X 本身就是一个数字,您可以使用 X$ 代替字符串。)如果一个人用整数进行数学运算(就像人们经常做的那样),可以使用 DefInt A-Z
来声明 "default" 类型将是 Integer 而不是 floating-point,因此您不需要在所有变量后缀 %
来指示整数。或者,您可能会为整数指定一个起始字母部分,其余部分为浮点数,如果您从 FORTRAN 或其他使用不同类型的不同起始字母约定的旧语言移植代码,这可能特别有用。
许多 Visual Basic 的设计都考虑到了这样的用例,即能够直接使用 BASIC 先前版本的代码片段,只需进行最小的更改,例如具有行号或使用 "Let" 来分配一个变量。我不是真正的历史学家,但我认为 "systems Hungarian" 是后来出现的,特别是当人们习惯于使用超过一两个字母作为变量名时,因为计算机变得足够强大以处理此类事情。所以我有点不同意你的前提,因为我认为 Deftype 只是在 BASIC 中,因为以前的版本有它,而不是因为它旨在帮助实施特定的编码风格。
我猜 DefVar 之所以被特别添加,只是因为他们将 Variant 添加为一种类型,而且 Variant 似乎应该像他们拥有的其他类型一样处理,尽管我认为也许程序员用语言实现它认为它和你现在一样没用。
显然,对于任何 Deftype,尤其是 DefVar,在 VB6 "new" 时代创建的任何东西都没有太多需求,当然现在没有任何新东西。
为了回答你的实际问题,我唯一能真正想到的是它会帮助明确你是有意使用默认的无后缀和 non-explicitly-typed 变量应该被视为变体。也许在您的应用程序的某些模块中您使用了 DefInt A-Z
,而在其他模块中您使用了 DefVar A-Z
,只是作为一种编码标准来确保任何默认值都是明确的并且可以很容易地理解。这有点牵强,但我当然听说过更奇怪的编码标准。
如果不出意外,如果使用某种外部工具来确保每个文件都以 Option Explicit
和 DefVar A-Z
以及其他一些标准(例如 Option Base
)开头,那么您不需要担心开发人员引入其他 Deftype 命令并让他们的 co-workers 希望他们的键盘会触电他们。
我记得 FORTRAN 中的字母 I 到 N 是为整数保留的。
我在 DEC PDP 范围内的第一个 BASIC 有 one-letter 个变量,字母后可选一个(或多个?)数字 - 所以你可以有 I 和 I0 到 I9。
我不记得变量 I 到 N 是隐式整数还是引入了 Def* 关键字来执行规则。
可能有人仍然在从 40 多年前迁移的 BASIC 代码中保留它们,但我希望 Rubberduck 标记它们。
你确实发现了一些遗迹!
Def[Type]
语句 从地狱中生成 在 VBA 中得到支持,似乎是为了强制执行某种 Systems Hungarian 符号。
例如:
Option Explicit
DefBool B
DefLng I, L
这些语句具有以下副作用:
Dim bSomething ' <~ that's a compile-time Boolean
Dim iGiveUp ' <~ that's a compile-time Long
Dim lNooooo ' <~ that's a compile-time Long also
并且:
Public Function IsUseful()
' function returns a compile-time Long
End Function
我们不要忘记:
Public Property Get BasicStuff()
' yep, that's a compile-time Boolean
End Property
你懂的。 Def[Type]
语句是血淋淋的邪恶,在现代代码中自愿使用它们应该通过键盘为您赢得 10K 伏电压*。
但是让我们敞开心扉,假装他们很棒一分钟。
有很多这样的说法:
DefBool
用于隐式类型Boolean
DefCur
用于隐式类型Currency
DefDbl
用于隐式类型Double
DefInt
用于隐式类型Integer
DefLng
用于隐式类型Long
DefSng
用于隐式类型Single
然后是这个:
DefVar
用于隐式类型Variant
现在,如果你不知道,这也是一个隐式类型的变体:
Dim anything ' no "As [Type]" clause
因此给定隐式类型 Def[Type]
关键字可以 指定隐式编译时类型 给定一系列适用的首字母前缀...
DefVar V
Dim vSomeVariant ' compile-time Variant (DefVar)
Dim foo ' also a compile-time Variant (implicit)
Dim bar As Variant ' also a compile-time Variant (explicit)
Dim vRedundant As Long ' compile-time Long ("As [type]" clause overrides DefVar)
即使采用开放的、匈牙利系统友好的方法,我也无法理解 DefVar
的一个合法用例。有吗?
*您的里程数可能会有所不同。
编辑以反映现实 (-:
=====行之间的原始post
=================
也许有点做作,但是 DefVar
有一个合法的用例:覆盖另一个 DefXxx
。
假设您已经决定几乎所有的变量和函数都属于 Long
类型,因此您包含了语句:
DefLng A
等等,您还想为默认类型保留几个字母。这是通过以下方式完成的:
DefVar P
DefVar V
它比明确设置每个范围更短,可以说更清晰。
=================
经过评论和快速测试后,很明显这不再是真的,如果曾经是的话。不过,我认为我 post 接下来的内容确实显示了至少一个 DefXxx
语句的合理案例:
顺便说一句,我在每个 VB 代码模块前加上
Option Explicit
DefObj A-Z
这迫使我显式键入每个变量和函数,因为键入的几乎所有内容 As Obj
都不会作为公共变量存在...它会立即抛出一个错误说(例如)Abs(x)
,一个明确的迹象表明我忘记给 X 分配一个特定的类型。在不鼓励它的环境中强类型化。
Deftype 语句来自更旧版本的 BASIC。我记得至少在 QBasic 中,默认情况下变量是 floating-point,如果需要不同的变量,可以使用后缀。 (因此,X 本身就是一个数字,您可以使用 X$ 代替字符串。)如果一个人用整数进行数学运算(就像人们经常做的那样),可以使用 DefInt A-Z
来声明 "default" 类型将是 Integer 而不是 floating-point,因此您不需要在所有变量后缀 %
来指示整数。或者,您可能会为整数指定一个起始字母部分,其余部分为浮点数,如果您从 FORTRAN 或其他使用不同类型的不同起始字母约定的旧语言移植代码,这可能特别有用。
许多 Visual Basic 的设计都考虑到了这样的用例,即能够直接使用 BASIC 先前版本的代码片段,只需进行最小的更改,例如具有行号或使用 "Let" 来分配一个变量。我不是真正的历史学家,但我认为 "systems Hungarian" 是后来出现的,特别是当人们习惯于使用超过一两个字母作为变量名时,因为计算机变得足够强大以处理此类事情。所以我有点不同意你的前提,因为我认为 Deftype 只是在 BASIC 中,因为以前的版本有它,而不是因为它旨在帮助实施特定的编码风格。
我猜 DefVar 之所以被特别添加,只是因为他们将 Variant 添加为一种类型,而且 Variant 似乎应该像他们拥有的其他类型一样处理,尽管我认为也许程序员用语言实现它认为它和你现在一样没用。
显然,对于任何 Deftype,尤其是 DefVar,在 VB6 "new" 时代创建的任何东西都没有太多需求,当然现在没有任何新东西。
为了回答你的实际问题,我唯一能真正想到的是它会帮助明确你是有意使用默认的无后缀和 non-explicitly-typed 变量应该被视为变体。也许在您的应用程序的某些模块中您使用了 DefInt A-Z
,而在其他模块中您使用了 DefVar A-Z
,只是作为一种编码标准来确保任何默认值都是明确的并且可以很容易地理解。这有点牵强,但我当然听说过更奇怪的编码标准。
如果不出意外,如果使用某种外部工具来确保每个文件都以 Option Explicit
和 DefVar A-Z
以及其他一些标准(例如 Option Base
)开头,那么您不需要担心开发人员引入其他 Deftype 命令并让他们的 co-workers 希望他们的键盘会触电他们。
我记得 FORTRAN 中的字母 I 到 N 是为整数保留的。 我在 DEC PDP 范围内的第一个 BASIC 有 one-letter 个变量,字母后可选一个(或多个?)数字 - 所以你可以有 I 和 I0 到 I9。 我不记得变量 I 到 N 是隐式整数还是引入了 Def* 关键字来执行规则。 可能有人仍然在从 40 多年前迁移的 BASIC 代码中保留它们,但我希望 Rubberduck 标记它们。 你确实发现了一些遗迹!