DefVar有一个合法的用例吗?

时间:2018-04-05 20:50:44

标签: vba vb6

VBA支持

Def[Type]来自地狱的语句,似乎强制执行某种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的单一合法用例。有吗?

*您的里程可能会有所不同。

3 个答案:

答案 0 :(得分:5)

Def 类型语句来自更早版本的BASIC。我记得至少在QBasic中,默认情况下变量是浮点数,如果想要一个不同的变量,则会使用后缀。 (所以,X本身就是一个数字,你可以使用X $代替一个字符串。)如果一个人用整数做数学(就像经常做的那样),可以用DefInt A-Z来声明& #34;默认&#34; type将是Integer而不是浮点数,因此您不需要使用%为所有变量添加后缀以指示整数。或者你可能会为整数指定一个起始字母的一部分,其余部分指定浮点,这可能特别有用,如果你从FORTRAN或其他使用不同类型的不同起始字母的惯例的旧语言移植代码。

许多Visual Basic的设计都考虑到了能够直接使用BASIC早期版本中的代码片段进行最小更改的用例,例如使用行号或使用&#34; Let&#34;分配变量。我不是真正的历史学家,但我认为匈牙利&#34;系统匈牙利语&#34;后来,特别是一旦人们习惯使用一两个字母作为他们的变量名称,因为计算机的功能足以处理这些事情。所以我对你的前提不同意,因为我认为Def type 只是在BASIC中,因为之前的版本有它,而不是因为它旨在帮助强制执行特定的编码风格。 / p>

我猜测特别添加了DefVar只是因为他们添加了Variant作为一种类型,看起来Variant应该像他们拥有的其他类型一样处理,尽管让我觉得可能是程序员用语言实现它认为它和你现在一样无用。

显然,对于任何在VB6为&#34; new&#34;时创建的内容,并不需要任何Def 类型,特别是DefVar,当然不会有任何新的东西。

要回答你的实际问题,我唯一能想到的就是它有助于明确表示你故意使用默认的unsuffixed和非显式类型的变量应该被视为Variants。也许在您的应用程序的某些模块中,您使用DefInt A-Z,而在其他模块中,您使用DefVar A-Z,就像编码标准一样,以确保任何默认值都是明确的并且可以很容易理解。这有点牵强,但我当然听说过更奇怪的编码标准。

如果没有别的,如果一个人使用了一些外部工具来确保每个文件都以Option ExplicitDefVar A-Z以及其他一些标准(例如Option Base)开头,那么你就不会# 39;需要担心开发人员引入其他Def 类型命令并让他们的同事希望他们的键盘能够电击它们。

答案 1 :(得分:1)

我记得FORTRAN,I到N的字母是为INtegers保留的。 我在DEC PDP系列上的第一个BASIC有一个单字母变量,在字母后面可选一个(或多个?)数字 - 所以你可以有I和I0到I9。 我不记得变量I到N是否是隐式整数,或者是否引入了Def *关键字来强制执行规则。 可能有人在40多年前从BASIC代码中迁移了它们,但我还是期待Rubberduck标记它们。 你确实发现了一些遗物!

答案 2 :(得分:0)

编辑以反映现实( - :

=====行之间的原始帖子

=================

可能有点做作,但DefVar有一个合法的用例:覆盖另一个DefXxx。 假设您已经确定您希望几乎所有变量和函数都是Long类型,那么您包括以下语句:

DefLng A

但是等等,你也想为默认类型保留几个字母。这是通过以下方式完成的:

DefVar P

DefVar V

它比明确规定每个范围更短,更明确。

=================

经过评论和快速测试之后,很明显这不再是真的,如果有的话。不过,我认为我接下来发布的内容确实显示了至少一个DefXxx声明的合理案例:

顺便说一句,我在每个VB代码模块前面加上

Option Explicit
DefObj A-Z

这迫使我明确地键入每个变量和函数,因为几乎没有任何类型As Obj将作为公共变量存活...它会立即抛出错误(例如)Abs(x),一个明确的表示我忘记给X分配特定类型。在不鼓励它的环境中强力打字。