代码之家  ›  专栏  ›  技术社区  ›  Mathieu Guindon

DefVar是否有一个单一的合法用例?

  •  6
  • Mathieu Guindon  · 技术社区  · 7 年前

    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[类型] 语句是极其邪恶的,如果你愿意在现代代码中使用它们,那么你通过键盘就能获得10千伏的电压*。

    但让我们敞开心扉,假装他们很棒。

    有很多这样的说法:

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

    还有一个:

    • DefVar 对于隐式类型 Variant

    现在,如果您不知道,这也是一个隐式类型的变量:

    Dim anything ' no "As [Type]" clause
    

    所以给定隐式类型 Def[类型] 关键词是为了, 指定隐式编译时类型 给定一系列适用的首字母前缀。。。

    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 回复  |  直到 7 年前
        1
  •  5
  •   user65839 user65839    7 年前

    Def 类型 语句来自更旧版本的BASIC。我记得至少在QBasic中,变量默认为浮点型,如果需要不同的变量,可以使用后缀。(因此,X本身就是一个数字,而您将使用X$作为字符串。)如果一个人正在用整数做数学(就像他经常做的那样),他可以使用 DefInt A-Z 声明“default”类型是整数而不是浮点,这样就不需要在所有变量后面加后缀 % 表示整数。或者,您可以为整数指定一段起始字母,为浮点指定其余的起始字母,这可能非常有用,尤其是当您从FORTRAN或其他较旧的语言移植代码时,这些语言使用不同类型的不同起始字母的约定。

    许多Visual Basic的设计都考虑到了这样一个用例,即能够直接使用Basic早期版本中的代码片段,而只需进行最小的更改,例如使用行号或使用“Let”指定变量。我并不是一个真正的历史学家,但我认为“系统匈牙利语”出现得较晚,尤其是当人们习惯于在变量名称上使用一个或两个以上的字母时,因为计算机已经强大到足以处理这些事情了。所以我有点不同意你的前提,因为我认为 类型 只是因为以前的版本有它,而不是因为它是为了帮助实施特定的编码风格而设计的。

    我猜添加DefVar尤其是因为他们添加了Variant作为一种类型,而且似乎应该像处理其他类型一样处理Variant,尽管我觉得用这种语言实现它的程序员可能认为它和您现在所做的一样没用,这很有趣。

    显然,不太需要任何Def 类型 ,尤其是在VB6是“新的”时创建的任何内容中使用DefVar,当然现在没有任何新内容。

    为了回答您的实际问题,我唯一能想到的是,这将有助于明确说明您有意使用默认的无固定类型和非显式类型的变量应被视为变量。可能在应用程序的某些模块中使用 定义A-Z ,以及在您使用的其他模块中 DefVar A-Z ,就像一个编码标准,以确保任何默认值都是明确的,并且易于理解。这有点夸张,但我确实听说过更奇怪的编码标准。

    如果没有其他问题,如果使用某种外部工具来确保每个文件都以 Option Explicit DefVar A-Z 也许还有其他一些标准(比如 Option Base ),那么您就不必担心开发人员引入其他Def 类型 命令,让他们的同事希望他们的键盘能把他们电死。

        2
  •  1
  •   sysmod    7 年前

    我记得FORTRAN语言中,字母I到N是为整数保留的。 我的第一个关于DEC PDP范围的BASIC有一个字母变量,可以选择一个(或多个?)字母后面的数字-所以你可以有I和I0到I9。 我不记得变量I到N是隐式整数,还是引入Def*关键字来强制执行该规则。 也许有人在40多年前移植的基本代码中仍然有它们,但我希望Rubberduck能够标记它们。 你确实发现了一些遗迹!

        3
  •  0
  •   Community Mohan Dere    5 年前

    编辑以反映现实 (-):

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

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

    可能有点做作,但有一个合理的使用案例 DefVar :覆盖另一个 DefXxx 。 假设您决定希望几乎所有的变量和函数都是 Long ,因此您包括以下声明:

    DefLng A

    但是等等,您还想为默认类型保留几个字母。这是通过以下方式实现的:

    DefVar P

    DefVar V

    与明确列出每个范围相比,它更短,更清晰。

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

    在评论和快速测试之后,很明显,这不再是事实,如果曾经是的话。尽管如此,我认为我接下来发布的内容确实为至少一个 DefXxx 声明:

    作为旁白,我在每个VB代码模块之前

    Option Explicit
    DefObj A-Z
    

    这迫使我显式地键入每个变量和函数,因为几乎没有任何类型 As Obj 将作为公共变量存在。。。它会立即抛出一个错误 Abs(x) ,这清楚地表明我忘记为X指定特定类型。在不鼓励输入的环境中输入强类型。