|
本帖最后由 joforn 于 2013-3-20 11:33 编辑
一般来说,如果模块中没有声明Option Explicit,那么在这个模块中可以不事先声明而直接使用一个变量。所以有人说:变量声明是不必要的,除非是编写的程序比较复杂时才需要使用变量声明。支持这一论点的用户列举一系列的好处,以证明声明变量基本是属于“没事找抽型”之类的人才会用的。
第一个论点:如果程序中过多出现DIM会让程序看起更长更复杂。其实如果一段代码在50行以下时,不声明变量的确可以少打许多个字符,至少可以为你节省几分钟的打字时间。这个节省的时间是必然,但是,是否是真正的节省时间,还得视程序是否是一次性运行成功。否则,在后面花费的调试时间会让这几分钟的优势丢去。一般来说程序编写代码的时间占用程序编译时间总合的20%~50%,其它的大部分时间花在了调试上(就算是一个程序天才,估计也不敢保证自己的程序100%不需要调试而直接运行)。
第二个论点:变量声明增加了程序的复杂度,一般初学者很难学会变量,会在上面浪费很多时间,这是不值得的。其实变量就那么几种大的类型:字符串、数值类型、逻辑值类型、对象。其中数值类型中包含整型、浮点两种类型。当然,还有三种类型的变量是以前面的几种类型单一或是多种组合而成,这三种变量就是数组、变体及自定义,但这三种最终的类型实际上仅是前面几种类型的扩展用法。数组:可以看成是某个类型数据的连续块;变体(Variant):直观上来看,这个类型的变量就是在某个类型的数值外面包了一个包装盒,包装盒的作用仅仅是增加了美观,但增加了数据的访问时间和数据的空间;自定义类型(Type):这个类型也就是一种或是几种的类型的数据组合,其目的是为了减少程序编写过程中访问数据的安全性(防止输入错误的变量名)及加快输入速度。综合对比可以看出,其实声明变量根本不可能增加程序的复杂度,反而在很多的时候会为我们带来方便。
第三个论点:专门为了学习变量而花费时间,完全是无用功。对于这一观点,我只能说如果看书的人一定要一页一页背下去看书的话,那还不如不要去看书。一般的书都会把所有的变量放在一章中,但是那只是为了好归类,并不是要读者去背下那一章。个人认为,变量的学习只要有上面第二段中的那个基本概念就行(估计半小时就能明白String、Long、Double、Boolean、Object),知道大致有哪些类型的变量变OK了,并不需背什么Long、Byte……在写程序时多使用几次Dim,慢慢就自然而然的记住了。也就是说平时只要有声明变量的这个习惯,过了一段时间,自然就能信手拈来。这其实是一个很简单的事件,不知道为什么这么多人一再强调说这很难?如果一个Dim的确是很难的话,那么IF……Else……、For……Next、Do……相比较Dim就容易了?还是说冒泡、二叉树、红黑树……之类的比Dim要简单的多?
综合上面所述,养成变量在使用前先声明的习惯并不会带来什么实际上的损失。
那么,变量声明是必须么?我的回答是否定的,但如果你认为声明一个变量对你没什么损失的话,我仍旧建议你使用变量声明,这个并不是为让你的程序更好,而仅仅是为是在你的程序出问题时更快的找到问题所在(实际提升的速度还得看个人的经验,便一般来说,对于5000行以上的代码可能会快很多,如果说你所有代码都能保证在100行以内,用不用都差不多)。
变量声明使用一定的规则有什么用?有很多人用如匈牙利命名法则之类的,这样用对于个人来说,说实话这样做对作者本人没有什么很大的意义。但是如果多人合作编写代码时就会体现出这类命名规则的优势。说白了,就是为了让别人能更快的看懂你的代码,对于作者本人用处并不大。如果说你想让你的代码变得“神鬼莫测”,那么你只要反其道而行即可,这样,就是别人得到你的代码,可能也会看着头晕眼花。这也是很多时候我回帖时直接重写代码,而不在发帖人的程序的代码上做修改的原因。因为很多代码直接重新写出来可能比去修改一段代码花费更少的时间。
下面有几段比较简单的代码(基本都不超过5行),可以从侧面提醒一下大家在使用变量时要注意的一些问题:
- Sub Test0A()
- A = 123
- B = "A123"
- C = 123
- Debug.Print A + B
- Debug.Print A + C
- End Sub
- Sub Test0B()
- Dim A As String, B As String, C As String
- A = 123
- B = "A123"
- C = 123
- Debug.Print A + B
- Debug.Print A + C
- End Sub
- Sub Test1A()
- A = "+1"
- B = "-1"
- Debug.Print A & " > " & B & " = " & (A > B)
- A = 1
- B = -1
- Debug.Print A & " > " & B & " = " & (A > B)
- End Sub
- Sub Test1B()
- Dim A As Long, B As Long
- A = "+1"
- B = "-1"
- Debug.Print A & " > " & B & " = " & (A > B)
- A = 1
- B = -1
- Debug.Print A & " > " & B & " = " & (A > B)
- End Sub
- Sub Test2A()
- ReDim Arr1(0 To 12)
- Open "C:\Boot.ini" For Binary As #1
- Get #1, , Arr1
- Close #1
- Debug.Print StrConv(Arr1, vbUnicode)
- End Sub
- Sub Test2B()
- Dim Arr1() As Byte
- ReDim Arr1(0 To 12)
- Open "C:\Boot.ini" For Binary As #1
- Get #1, , Arr1
- Close #1
- Debug.Print StrConv(Arr1, vbUnicode)
- End Sub
复制代码
注意:上面的代码所出现的问题并非不使用变量声明就会出错的证明,而是为了说明一下,在不使用变量声明后如果不注意数据的来源,则可能会发生的一此意想不到的问题——有可能是语法上的,也可能是逻辑上的错误。
再次声明一下:不是说建议初学者一定要先完全弄明白所有的数据类型的特性之后再开始写代码,而是说只要有个基本的概念,然后在写代码的每次稍稍多一点时间去稍稍关注一下就行了。就像是String,如果说一定要初学都先明白了BSTR结构后再去用String类型是不可能的,要让初学者先明白SafeArray结构再来学数组更是不可能的。
学习数据类型是一个慢慢积累的过程,而不是说先花了十几二十天就能完全看明白的东西。
还有半个小时就坐车回家过年去了。借着此帖在这里先给所有的人拜年了——蛇年大发!
首先要谢谢原来给我加精华的版主。不过个人认为,虽然本帖有些经验可以供新学者学习,但自认为尚不足以加精华,故自己解除精华。
但此举并不代表本人认为自己的观点是错误的,而仅仅是本人自己认为精华帖应该能更“精华”一些。
该贴已经同步到 joforn的微博 |
评分
-
12
查看全部评分
-
|