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
的单一合法用例。有吗?
*您的里程可能会有所不同。
答案 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 Explicit
和DefVar 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分配特定类型。在不鼓励它的环境中强力打字。