DefVar有一个合法的用例吗?

Mat*_*don 6 vb6 vba

Def[Type]VBA支持从地狱产生的语句,似乎是强制执行某种匈牙利语系统表示法.

例如:

Option Explicit
DefBool B
DefLng I, L
Run Code Online (Sandbox Code Playgroud)

这些陈述有以下副作用:

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
Run Code Online (Sandbox Code Playgroud)

和:

Public Function IsUseful()
' function returns a compile-time Long
End Function
Run Code Online (Sandbox Code Playgroud)

我们不要忘记:

Public Property Get BasicStuff()
' yep, that's a compile-time Boolean
End Property
Run Code Online (Sandbox Code Playgroud)

你明白了.Def[Type]声明是血腥的邪恶,并愿意在现代代码中使用它们通过键盘赚取10K伏特*.

但是,让我们敞开心扉,假装他们一分钟都很棒.

有很多这样的陈述:

  • DefBool 对于隐式类型 Boolean
  • DefCur 对于隐式类型 Currency
  • DefDbl 对于隐式类型 Double
  • DefInt 对于隐式类型 Integer
  • DefLng 对于隐式类型 Long
  • DefSng 对于隐式类型 Single

然后就是这个:

  • DefVar 对于隐式类型 Variant

现在,如果你不知道,这也是一个隐式类型的Variant:

Dim anything ' no "As [Type]" clause
Run Code Online (Sandbox Code Playgroud)

因此,给定隐式类型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)
Run Code Online (Sandbox Code Playgroud)

即使采用开放的,系统 - 匈牙利友好的方法,我也无法理解一个合法的用例DefVar.有吗?


*你的旅费可能会改变.

小智 5

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

很多的Visual Basic的设计铭记的是能够直接使用的代码段,从最小的变化,如具有行号或使用"我们"来分配变量BASIC之前版本的使用情况.我不是一个真正的历史学家,但我觉得"系统匈牙利"后来,尤其是一旦人们使用不止一两个字母的更适合自己的变量名称作为计算机有足够强大,可以处理这样的事情的习惯.所以我对你的前提不同意,因为我认为Def 类型只是在BASIC中,因为之前的版本有它,而不是因为它旨在帮助强制执行特定的编码风格.

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

显然,在VB6为"新"的时候创建的任何东西都不需要任何Def 类型,特别是DefVar,当然也不需要任何新的东西.

为了回答您的实际问题,我真的可以想到的唯一的事情是,这将有助于作出明确,你是故意使用无后缀和非显式类型变量的默认应该变体治疗.也许在您使用的应用程序的某些模块中DefInt A-Z,以及您使用的其他模块中DefVar A-Z,作为编码标准,以确保任何默认值都是明确的并且可以很容易理解.这有点紧张,但我当然听说过更奇怪的编码标准.

如果不出意外,如果使用一些外部工具,以确保每个文件开始Option ExplicitDefVar A-Z和可能其他一些标准(如Option Base),那么你就不需要担心开发商引入其他防守的命令和有他们的同事希望他们的键盘会电击他们.