2001年测试与2002年正式推出
Visual Basic .NET是微软将Visual Basic带入.NET平台时形成的语言和开发工具。2001年属于公开测试与开发者准备阶段:6月19日,比尔·盖茨在亚特兰大的TechEd大会宣布Visual Studio .NET及.NET Framework的Beta 2版本可供使用,其中明确包含Visual Basic .NET。微软希望开发者利用既有语言经验,建立能够通过网络交换数据和调用功能的XML Web服务。
正式推出则是另一阶段。2002年2月13日,盖茨在旧金山VSLive!大会发布Visual Studio .NET与.NET Framework;当日公告也说明,最终版本从此前1月起已向MSDN订户提供。因此,测试版开放、订户取得最终版与公开发布大会有不同日期,不宜把2001年统称为正式版发行年。
把语言放到共同运行平台上
这一改造面对的核心问题,是不同语言、组件和应用环境之间的衔接。杰弗里·里克特在2000年的技术文章中解释,.NET使用共同的类型体系与公共语言运行库,英文简称CLR。面向该平台的Visual Basic编译器产生托管代码,程序运行需要CLR参与,而不只是依靠旧版Visual Basic的运行支持。
编译结果中的微软中间语言与元数据,分别表达待执行操作以及类型、成员等结构信息;运行时据此装载类型、解析调用,并把代码转为机器能执行的形式。共同类型体系还使不同语言编写的类可以互相配合。开发者因此能保留一种语言的表达习惯,同时使用跨语言的组件和类库,而不必为每种语言重新提供整套功能。
参考:[3]
以继承减少业务对象的重复
类继承是这种变化的具体表现。保罗·维克的早期语言专著用客户与雇员说明:两类对象都需要姓名和地址,与其重复声明这些字段,不如先建立Person类,再让Customer与Employee分别继承它,各自增加客户编号或薪资。语句“Inherits Person”表达的是类型间的从属关系,不是复制一份互不相干的源代码。
这样,一个接收Person参数、输出姓名与地址的过程,也能处理客户或雇员。调用方不必为每种具体身份另写相同逻辑。不过,这不意味着类型界限消失:以Person看待对象时,不能直接访问只属于雇员的薪资字段;一个雇员对象也不会因为转换写法改变,就变成客户。Visual Basic .NET还限制一个类只能有一个直接基类。
参考:[4]
继承也进入可视化界面
2001年6月,肯·斯宾塞在《MSDN Magazine》中展示了窗口继承的用途:公司多张窗口需要相同标志、按钮及位置时,可以先设计一个基本窗口,再让其他窗口继承它的界面与行为。普通模板主要减少最初绘制的工作,继承则把共同部分组织在同一个基类中,便于集中维护。
这依赖一个关键事实:Windows Forms窗口本身就是类,因而既能用设计器摆放控件,也能使用类的继承规则。实例并不意味着修改母窗口后所有已部署程序会自动更新;斯宾塞特别提醒,项目若使用本地复制的基类程序集,必须更新该副本,派生窗口才能取得变化。设计层面的复用仍然需要与实际部署相配合。
参考:[5]
产品团队展示从数据库到Web服务
在2002年发布会上,Visual Basic .NET产品部门负责人罗布·科普兰演示了按书号查询图书的服务。他在开发环境中新建ASP.NET Web服务,把数据库表拖入设计界面,再配置连接、数据适配器和按ISBN筛选的存储过程。工具承担了部分连接及数据映射工作,程序员仍须规定查询条件与对外方法。
随后,网页上的输入框接收ISBN,按钮事件调用服务,把返回的书名和价格放入页面;调试器还能逐步跟踪网页、服务和数据库存储过程之间的调用。这展示了当时产品团队的使用场景:可视化开发不再只围绕桌面窗口,还要帮助业务程序跨越客户端、服务器与数据层。它是功能演示,不能直接视为所有真实项目都能达到同样开发速度的证明。
参考:[6]
迁移工具解决不了全部差异
平台重建也带来兼容成本。Visual Studio 2003的早期产品帮助文档明确说明,升级向导会另建Visual Basic .NET项目,保留原有Visual Basic 6.0项目;新的项目不能再由旧版打开。工具会转换部分语法及窗口,并生成报告和待办注释,提示仍需人工修改的地方。自动转换因此只是迁移的一环。
数据类型是容易忽略的例子:旧版Integer为16位,而.NET版Integer对应32位System.Int32;原先的16位用途需要考虑Short。尤其在调用旧组件或外部过程时,名称相同并不保证数据宽度相同。结合继承、共同运行库与服务开发可见,这次变化扩大了程序组织和复用的方式,也要求开发者重新检查边界、部署与兼容性。
参考:[7]