柔性的进行数据类型转换

ZDNet软件频道 时间:2003-11-06 作者:ZDNet China |  我要评论()
本文关键词:
在.NET出现之前,Windows服务器的默认脚本语言都是“无类型(type-less)”语言。所以必须对付那些由于使用无类型语言而产生的古怪问题。这些问题的绝大部分都和数据类型转换有关系。

 

本文译自Builder.com,未经许可请勿转载

在.NET出现之前,Windows服务器的默认脚本语言都是“无类型(type-less)”语言。这一术语指得是程序员不能显式的指定变量的数据类型,如String或者Date。在这种语言模型中,所有的变量的数据类型都是Variant,它是一种可以保存任何数值和对象的“大杂烩”数据类型。与之相反,.NET框架中的语言可以称为“强类型”的,这包括Jscript的继任:Jscript.NET。

有些开发工作室还没有.NET或者出于种种原因而不能迁移到.NET平台。这些工作室必须对付那些由于使用无类型语言而产生的古怪问题。这些问题的绝大部分都和数据类型转换有关系,数据类型转换一般发生在脚本引擎执行某些用户所请求的数据计算或者管理时。

 

当使用诸如VBScript或者Jscript这样的无类型语言时,开发者必须留意每个变量的数据类型。例如,下面VBScript代码例子中的前三个Response.Write语句都没有问题,但是第四个将会出现一个Type Mismatch(类型不匹配)错误。

Dim strLineBreak
Dim vntDate, vntNewDate

strLineBreak = "<br>" & vbNewLine

vntDate = "April 8, 2002"

vntNewDate = DateAdd("yyyy", 1, vntDate)

Response.Write (vntNewDate) & strLineBreak
Response.Write (vntNewDate + 1) & strLineBreak
Response.Write (vntNewDate + "1.25") & strLineBreak
Response.Write (vntDate + 1) & strLineBreak

在这段代码中,我们给vntDate变量赋值“April 8,2002”。尽管这看起来好像是一个日期,但VBScript引擎只是简单的把它当作一个字符串或者字符组。在下一行,我们使用DateAdd函数来给vntDate加上一(1)年。

 

在这里,我们将看到例子背后的数据类型转换。vntDate变量是一个String数据类型,但DateAdd函数处理和返回Date数据类型。因此,该函数需要正确的将”April 8,2002”这个字符串值转换成有效的Date数据类型并返回新数据(在加上一年之后)赋值给vntNewDate。在后两行,我们打印了这个日期——先打印这个日期本身,然后打印加上1之后的日期,它应该是4/9/2003。

 

在第三个Response.Write语句中,当我们把字符串“1.25”和Date数据类型相加时,VBScript引擎将试图进行某些类型转化。由于Date数据类型在内部是以数字的形式表示的(整数部分表示天,分数部分表示小时、分和秒),因此对日期数据类型进行算术运算是允许的。然后,VBScript引擎试图把字符串“1.25”转换成内部数据来来执行所请求的加法运算。这样,计算的结果就是4/9/2003 6:00 AM。

 

现在让我们看看为什么进行第四个Response.Write语句时为什么会出错。尽管在DateAdd函数中把“April 8,2002”转换成Date来进行对它的运算,但vntDate依然是一个String数据类型的变量。因此,当我们试图对这个变量进行加一运算时,VBScript引擎试图把它转换成一个数字,但显然它并不能表示成一个数字,因此会发生类型不匹配的错误。

 

记住当请求或者传递一个ASP页面时,Request.Form值和Request.QueryString值总是返回字符串。在VBScript中使用类型转换函数,如CLng、Cint和Cbool,把要处理的值在处理之前转换成合适的类型是个不错的主意。

 


本文作者Shawn Dillon是珠穆朗玛技术公司的高级顾问,他在企业Web开发以及网页托管(Web hosting)方面的经验已逾六年。




责任编辑:李宁

欢迎评论投稿

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134