web services是visual studio开发工具系统采取的第二大改进。就核心而言,一个web services就是一个通过标准的网络协议发布的中间层的事件处理函数。既然它们使用http作为传送机制(见figure 2),所以可以通过防火墙进行通信。只要合适地分配url,你可以简单地在一个网络应用程序中构造多种web services。在程序运行时,所有这些内部构件之间的调用都会自动打包,通过xml接口进行调用。开发者可以在任何平台上、使用任何语言编写和使用web services。如果你需要保密,你可以使用secure socket layer (ssl)或标准校检技术。

figure 2web services architecture
如果你对这些听起来开始觉得有点熟悉了,那是一个很好的开始。用于组件之间传送数据的机制是soap,即简单对象许可协议。don box在2000年三月出版的msdn™ magazine中详细的介绍了soap。
所有这些新的特性都是为了让网络程序开发者可以利用已存在的、可再次使用的web services进行组合,从而可以更快的编写他们的程序,而不用每次都重头来编写它们。这将带来程序代码提供者和程序开发者的新时代。
使用下一个版本的visual basic,你很快就可以把一个具体项目中的函数以web service的形式发布和实现。你也许很熟悉把一个visual basic 的类定义为public的过程。在下一个版本的visual basic中将会有一个新的标志,暂时叫作webpublic。这意味着程序将作为web service发布。它不仅仅可以通过com接口为需要它的当地项目所用,而且可以为任何引用了它的url地址的网络程序服务。正如你可以把引用加入到一个新项目中的公共对象中一样,你也可以把引用加到网络程序中,然后象使用当地程序一样使用它。
当然,运行机制是有些不同的。visual basic能够通过com接口对当地对象解析引用。当你加入一个网络服务的引用到你的应用程序中时,远程对象将自动生成接口的定义,并使用soap协议发送到visual studio开发环境中来。虽然这些将以xml形式产生,但你不用自己做任何连接的工作。visual basic将为你自动处理它。在接收到接口定义以后,你就可以使用intellisense,如同你已经编写了引用该对象的代码一样。
这有一个简单的例子。在某些场合下,你也许想编写这个叫seahawks的函数,它可能和下面这些代码有点类似:
public function seahawks(byval opponent as string) as string
seahawks = "lose"
end function
如果你构造的项目中包括了这个函数,visual basic将自动生成关于这个函数的xml格式的描述,并把它发布到网上。
<?xml version='1.0' ?>
<methods href='http://julian/football/teams'>
<method name='seahawks' href='seahawks'>
<request>
<param dt='string'>opponent</param>
</request>
<response dt='string'/>
</method>
</methods>
这个xml文件将用于描述seahawks函数。如果你使用的是visual studio开发环境,你就可以把任何已经发布的web service直接拖放到应用程序中,创建一个新类。如果你想调用internet网上任何地方的web service,你只需要创建包含web service的类的一个实例,然后就可以调用它的已发布的方法。
当seahawks函数被调用时,它会通过xml信息包自动通信。如果你使用的是microsoft® internet explorer 5.0(包含了xml支持),你可以在你的浏览器中试运行该函数。你也可以如下一样使用url地址调用该函数:
http://julian/webservice1/component1.methods/seahawks?opponent=miami
它将返回如下xml格式的数据:
<?xml version="1.0" ?>
<response>lose</response>
为了方便web services的开发,visual basic将引入一个新的对象类型,即web service。你可以象现在创建一个当地的dll文件一样简单地设计和发布你的web service到远程服务。
语言上的改进
长期以来,在喜欢visual basic的程序开发者和喜欢另外一些更“复杂”的语言的程序员之间的关系一直都很紧张。我不止一次的为我所最爱的编程语言反驳诸如”玩具语言”之类的控诉,他们认为visual basic缺乏oop的特征。
好,那么猜猜发生了什么?下一个版本的visual basic将最终结束他们的抱怨。microsoft计划加入面向对象编程的三大特性:继承性、多态性和重载。这还不是所有!另外一些结构,包括结构化的错误处理和浏览也将被引入visual basic语言。
继承性的特性允许你设计一个基类,然后编写一些派生类,它们继承基类的功能,这样做可以节约时间,并提高程序的可重用性。例如,你编写了一个名叫baseclass的基类,它有一个函数:
function getcustomername()
' do some stuff
end function
现在你想再写一个类,它可以象调用本身的函数一样调用基类的getcustomername函数。过去的方法是什么呢?这在过去没有办法。然而,现在的新的方法只需在新的类的上面插入如下简单的一行语句:
inherits baseclass
function getcustomerid()
' do some stuff
end function
编写两个或更多的名字相同但具有不同标识符的函数,这就是重载。在某种程度上,visual basic在函数调用时对内部类型的转换以及属性的设置中已经实现了重载。比较以下两行有效的visual basic 代码:
text1.text = "7"
text1.text = 7
在这两个调用中,text1中的text都将被设为字符串“7”。这就是重载调用,因为visual basic知道如何处理输入的不同的数据类型。它把它们作为变量处理,并自动进行转化。当你调用一些参数类型有明确定义的函数时,visual basic也会作同样的转化。下面的两个函数调用:
a = setval("this")
a = setval(7)
都可以正确调用以下函数:
function setval(x as string)
form1.text1.text = x
end function
既然visual basic已经可以传送多种不同的变量类型,为什么还需要重载功能呢?这是因为虽然目前单独的一个函数已经可以处理多种数据类型,它不能根据传入的不同的数据类型产生不同的动作。相反的,比较以下两个函数:
function getcustomerid(custname as string) as integer
' look up customer id based on customer name
end function
function getcustomerid(purch as long) as integer
' look up customer id based on purchase order
end function
通过重载,你可以根据输入的数据类型来实现函数。这对于下一个版本的visual basic是很重要的,因为它具有一个新的特性╠╠缺省数据类型保护。一般来说变量的自动转换是有利的,但可以想到有时也会给你带来麻烦。例如在前面的setval的例子中,如果你要传送的是字符7而不是字符串“7”,那会发生什么情况呢?下一个版本的visual basic将会自动捕获这个错误。(如果你的代码是基于visual basic以前的无类型识别的功能,这个特性会被禁用)
最后,多态性是对已定义的类的再定义过程。例如,你想写一个baseclass类的派生类,但你想重新改写getcustomername函数。在下一个版本的visual basic中,你可以用类似以下这种新方法来实现这种类的定义:(注意:最终的语法取决于正式的版本)
inherits baseclass
function getorders()
overrides function getorders()
•••
end function
更多的语法特性