打印本文 打印本文 关闭窗口 关闭窗口
浅析VBS中的Null子类型
作者:武汉SEO闵涛  文章来源:敏韬网  点击数809  更新时间:2009/4/23 15:43:43  文章录入:mintao  责任编辑:mintao

原文地址:
http://blog.csdn.net/estyle/archive/2004/06/30/30932.aspx
欢迎转载!但请注明出处(原文地址)和我的姓名:靳田
谢谢啦! ^_^

  VBS中的数据类型只有一种,既Variant型。而Variant又可包含多种数值信息类型,它们被称之为子类型,例如Boolean、Integer、Double、String等!目前版本的VBS包含13种数据子类型,包括现在我们要讨论的Null。

  微软官方文档中对Null子类型的描述是“不包含任何有效数据的Variant”。VBS初学者很可能会混淆Empty子类型和Null子类型,最有效的建议莫过于就是多看官方文档,那里面写得很清楚——至少对Empty写得很清楚。Empty并不是今天我们的主题,所以留给还不是很明白的朋友自行查阅资料并思考。

  VBS中有一个IsNull函数用以判断表达式是否包含有效数据,或者说是否是Null子类型,这个想必大家都应该很清楚。问题出在下面这段没有使用IsNull函数的代码上:

  Dim A
  A=Null
  If A=Null Then
    MsgBox "Some Words Here!"
  End If

  如果你知道为什么上面这段代码不会弹出信息框,那也没有多大必要继续虐待你自己的眼睛了。

  我在网上查过一些非官方的说明,比较经典的说法是:包含Null的表达式本身就是Null。在这里相当于判断条件中的“A=Null”等价于“Null”,既可把“If A=Null Then”看作“If Null Then”!如此以来,消息框没有出现就可以解释了。
  但这个解释稍显模糊,不是吗?我们接着往下看。

  在理解子类型的时候,首先思想上就请一定不要将它和值混为一谈。很高兴看到所有稍懂VBS的人都知道“A=Integer”有许多悬念!
  但是,Null比较特殊,它本身还是VBS中的五个关键字之一,所以“A=Null”的用法是正确的。
  ——请注意区别Null关键字和Null子类型,用在程序中用到的都是Null关键字,Null作为子类型只在意义和概念层面上!
  再看看官方文档中对Null关键字的解释:Null关键字用于指明变量包含的数据无效!
  所以代码的第二行,实际作用是让变量A中储存的数据无效化(赋了个炸弹给A,Boom),虽然这对后面的代码并没有影响。
  代码第三行,任何数据和无效的Null进行相等比较,就好像任何数除以0都会出错一样无效,所以返回值仍然是Null。
  这样解释是不是要清楚多了?

  为了加深理解,这里还是要牵扯一点Empty子类型和Empty关键字,官方说明自己去查。
  未初始化的变量是Empty子类型,但因为归根结底是Variant型的,所以根据上下文它可以自动取值0或者零长字符串。而Empty关键字在比较表达式中相当于指代零长字符串或0!看下面这段代码:

  Dim A
  A=0
  If IsEmpty(A) Then
    MsgBox "Some Words Here!"
  End If

  很明显,A已经被初始化了,所以IsEmpty(A)为False!
  但如果我们把“If IsEmpty(A) Then”替换成“If A=Empty Then”呢?
  消息框出来了!这下是不是对子类型和关键字的区别更明白些了?

  我们已经知道,Null关键字在参与比较运算的时候,由于无效的数据无法比较,所以结果无论如何不为True。那其它几种运算呢?请自行尝试吧,呵呵。

  现在,再请考虑考虑,“IsNull(Null)”的返回值是什么?其实这句代码会产生一个编译期错误。这说明关键字和值之间是有区别的!——注意,并非说关键字不能当作参数传递给函数。我努力了,暂时还没有对这个问题得出更深入的结论,如果你知道,请赐教。

  其实根据这个问题,我还进行了一些人生哲学方面的思考,有兴趣可以看看我的上一篇文章——由VBS中Null想到的人生方法论。

  总结一下:
  一、多看官方文档或许有好处;
  二、不混淆子类型、关键字和值,如果能区分清楚当然更好;
  三、无效数据(Null子类型的变量或Null关键字)参与比较运算,结果无效(返回Null关键字),其它类型的运算请自行总结。

打印本文 打印本文 关闭窗口 关闭窗口