第 1 章 面向 Visual Basic开发人员的 Microsoft .NET Framework入门指南

 第 1 章 面向 Visual Basic开发人员的 Microsoft .NET Framework入门指南

第 1 章 面向 Visual Basic开发人员的 Microsoft .NET Framework入门指南

 

发布日期: 10/26/2005 | 更新日期: 10/26/2005

本章内容:

对软件开发人员而言,Microsoft .NET Framework 以及面向 .NET Framework 的 Microsoft Visual Studio 对应版本都是卓越的创新。如果您曾用 Visual Basic 6(或更早的版本)进行过编程,您会很欣赏这些新的开发和执行环境在工作效率、安全性、可靠性以及“可部署性”方面的提高。

每个程序均依赖于其平台和其他库来提供运行时服务。Visual Basic 6 的编程人员非常了解由 Visual Basic 运行库提供的这些服务类型。Java 编程人员使用 Java 虚拟机 (JVM)。而其他编程人员则使用适用于其开发技术的库。Microsoft .NET Framework 类库提供一个丰富的库,用于创建在称为公共语言运行库(CLR) 平台(或执行环境)上运行的应用程序。本章将为您介绍 .NET Framework 的基本知识、它的类库,以及组成 Microsoft Visual Studio 的开发人员工具。在本章结尾处,将重点介绍 .NET Framework 2.0 和 Visual Studio 2005 中的一些新功能,本书的其他部分将更详细地介绍这些内容。

.NET Framework CLR 是管理关键平台服务(包括内存和安全性)的执行环境。面向 .NET Framework 的代码通常称为托管代码,因为它需要由执行环境提供的托管服务。为 .NET Framework 编写的所有 Visual Basic 代码都是托管代码。包括 Windows 应用程序、Web 应用程序和所有其他类型的应用程序。

*
本页内容
可以构建的应用程序可以构建的应用程序
智能客户端 Windows 应用程序智能客户端 Windows 应用程序
Web 应用程序Web 应用程序
Web 服务Web 服务
Windows 服务Windows 服务
控制台应用程序控制台应用程序
类库类库
智能设备应用程序智能设备应用程序
安装和部署项目安装和部署项目
一种真正集成的开发环境一种真正集成的开发环境
什么是 .NET?什么是 .NET?
公共语言运行库和中间语言公共语言运行库和中间语言
通用类型系统通用类型系统
对象和值对象和值
类、方法、属性、字段和事件类、方法、属性、字段和事件
Framework 类库Framework 类库
命名空间命名空间
程序集和元数据程序集和元数据
数据访问:ADO.NET数据访问:ADO.NET
Windows 应用程序Windows 应用程序
Visual Basic 6 和 Visual Basic 2005 的异同Visual Basic 6 和 Visual Basic 2005 的异同
Visual Basic 2005 中的重要新功能Visual Basic 2005 中的重要新功能
Web 应用程序Web 应用程序
ASP、ASP.NET 1.0 和 ASP.NET 2.0 之间的异同ASP、ASP.NET 1.0 和 ASP.NET 2.0 之间的异同
ASP.NET 2.0 的重要新功能ASP.NET 2.0 的重要新功能
Visual Studio 2005 和 .NET Framework 2.0 中的增强功能Visual Studio 2005 和 .NET Framework 2.0 中的增强功能
Visual Basic 增强功能Visual Basic 增强功能
IDE 增强功能IDE 增强功能
新的 Visual Web Developer新的 Visual Web Developer
ClickOnce 部署ClickOnce 部署
小结小结

可以构建的应用程序

您可能已经听说过许多关于 .NET 和 XML Web 服务的宣传。因为 .NET Framework 和 Visual Studio 2005 使构建和使用 Web 服务变得非常简单,所以多数这样的宣传都是名副其实的。但是,Microsoft .NET 技术不仅仅关于 Web 服务。Visual Studio 2005 和 .NET Framework 在创建其他类型的应用程序(包括 Windows 应用程序和 Web 应用程序)时功能也非常强大。有时,关于 Web 服务的宣传掩盖了使用 Microsoft .NET 技术创建各种应用程序以及面向 .NET Framework 的很多好处,包括增强的安全性、开发人员工作效率的提高、部署和维护成本的降低以及用于许多通用任务的大量预建库。

智能客户端 Windows 应用程序

当然,可以创建 GUI 驱动的 Windows 应用程序,它类似于用 Visual Basic 6 创建的 Windows 应用程序。这些 .NET 应用程序通常称为 Windows 窗体应用程序、胖客户端或智能客户端。Microsoft .NET Framework 为 Windows GUI 应用程序提供了许多远胜于 Visual Basic 6 功能的增强功能,例如停靠、锚定、不透明度、新控件和更多公开为事件的 Windows 消息。

术语智能客户端是指这样一种 Windows 应用程序,它将桌面应用程序的处理能力和丰富的用户界面 (UI) 以及通常与 Web 应用程序相关的部署和连接功能组合在一起。智能客户端是具有如下功能的传统 Windows 应用程序:使用 Web 服务;支持脱机模式;可从中央服务器进行部署;提供自动更新(从中央服务器);或支持多种类型的设备。由于 Microsoft 技术简化了部署,而公司在寻求网络边缘的处理能力使用方式的同时,正与基于 Web 接口的局限性进行抗争,因此对智能客户端的兴趣日益增强。

Web 应用程序

.NET Framework 已成为一种相当受欢迎的用于 Web 应用程序的技术。.NET Framework 中的 Web 功能(统称为 ASP.NET)包含于一个丰富的对象模型之中,该模型提供的功能和可伸缩性远胜于其前身ASP(现通称为传统ASP)。自其引入之时起,ASP.NET 就是一系列非常高效的技术而用于创建和部署各种级别的应用程序,从小规模应用程序至企业级规模的 Web 应用程序。

Web 服务

XML Web 服务是 ASP.NET 的一部分。传统的 Web 页以 HTML 输出响应 HTTP 请求。相比之下,Web 服务基于 SOAP。SOAP 是一个基于 XML 的协议,它定义两个系统间交换消息的语法和规则。SOAP 消息可以象 Web 页请求一样通过 HTTP 传输,即您可以公开服务(例如,Web 服务),这些服务可通过允许在端口 80 上通信的大多数防火墙进行访问。

术语方言 是指用于表示某些类型数据的 XML 版本的规则。SOAP 是一种用于消息交换的 XML 方言。对于许多不同的 XML 用途(包括标准系统和专用系统),定义了相当多其他的 XML 方言。

Windows 服务

一个长期困扰 Visual Basic 编程人员的问题是,难以创建可以作为 Windows 服务(以前的 NT 服务)运行的应用程序。Windows 服务是执行任务或为其他程序提供服务的后台应用程序。Windows 服务通常会自动启动和运行,而不管用户是否登录。它们由一个名为服务控制管理器 (Service Control Manager) 的 Windows 子系统控制。在 .NET Framework 之前,Visual Basic 开发人员必须使用第三方工具才能创建可作为服务运行的应用程序。使用 .NET Framework 创建 Windows 服务应用程序与创建任何其他类型的应用程序一样简单。服务可以用任何与 .NET 兼容的语言(包括 Visual Basic)编写。

控制台应用程序

控制台应用程序是一种经常被忽略但却功能强大的应用程序类型。控制台应用程序以流的方式输入和输出数据,而不是像 GUI 应用程序那样使用点击 (point-and-click) 交互模型。控制台应用程序通常称为命令行应用程序。Visual Basic 6 未提供一种方便的方法来创建控制台应用程序,但是可以利用 .NET Framework 在 Visual Basic 或任何与 .NET 兼容的语言中创建控制台应用程序。

类库

最大限度地重用代码和二进制文件是专业开发人员的基本目标。一种实现此目标的方法是设计软件解决方案,以便代码通用且可重用。然后,通过生成 DLL 文件将潜在可重用的代码封装到类库中。对于 Visual Basic 6 编程人员而言,该过程和创建 COM DLL 项目有点类似,不同之处在于 Visual Studio 2005 创建的 DLL 文件不是 COM 组件。它们是包含托管代码的程序集。(程序集将在本章后面介绍。)这些类库中的类可以是任何类型的类,包括控件和组件(可将它们添加到 Visual Studio 2005 IDE 的工具箱中)、扩展 Framework 类库的类(例如专用窗体),或者完全由您自己实现的类(例如,业务规则类)。

智能设备应用程序

Windows、控制台以及 Web 应用程序(包括 Web 服务)均面向 .NET Framework。还可以编写面向 .NET Compact Framework 的应用程序。.NET Compact Framework 是完整的 .NET Framework 针对智能设备的一个子集。.NET Compact Framework 优化后可运行于资源简化(如内存和屏幕大小)的设备(例如,Smartphone 和其他手持设备)。Visual Studio 2005 包括一个智能设备模拟器,以便于智能设备应用程序的开发和调试。

安装和部署项目

使用 Visual Studio 2005,可以创建几类安装和部署项目。现在,安装和部署项目已经没有过去那么重要了,因为许多部署问题已经经过简化,包括无需注册单个应用程序使用的组件(即,私有程序集)。但是在许多情况下,仍然希望有一个健壮且具有专业外观的安装程序。Visual Basic 6 开发人员会发现,与 Visual Basic 6 中的打包和部署向导相比,Visual Studio 2005 中的安装和部署项目有了很大的改进。开发界面的功能和灵活性以及生成 Microsoft 安装程序的 MSI 安装包,为 Visual Basic 开发人员提供了以前只通过第三方工具获得的功能。

一种真正集成的开发环境

Visual Studio .NET 为您可以构建的所有类型的应用程序引入一个统一的开发环境。Visual Studio 2005 是这种统一环境发展中的最新成果。它远不只是一个集成的编辑器、编译器和调试器。通用的外壳(如图 1-1 所示)承载组成 Visual Studio 2005 各种类型的工具,例如 Visual Basic 代码编辑器、可视化 Windows Form 设计器、新的可视化 Web 设计器和服务器资源管理器等。该外壳也可扩展,允许将外接程序、新的项目类型以及新的设计器插入到开发环境中。


1-1 Visual Studio 2005 集成开发环境。

Visual Studio 2005 IDE(集成开发环境)是一个健壮的工作环境,您可能会在其中花费绝大部分的开发时间。例如,在这个环境中,您可以编写 Web 应用程序的界面、处理金融事务的 Windows 服务、向多个后端办公系统公开数据的 Web 服务,以及通过后端办公 Web 服务检索数据的智能客户端。您还可以使用 IDE 调试所有这些应用程序,运行单元测试(通过第三方工具或 Microsoft 即将推出的工具),管理企业服务(例如 MSMQ)以及管理 SQL Server 等。

什么是 .NET?

准确理解“.NET”的含义具有一定的挑战性。如果询问五个经验丰富的 .NET 开发人员“什么是 .NET?”,可能会得到五个不同的答案,就像询问“什么是 Microsoft Windows?”或者“什么是计算机程序?”时会得到不同的答案一样。之所以会产生这些差别,是因为不同类型的用户都从他们自己的角度来理解技术。从一名开发人员的角度来看,.NET 实际上包括三项内容:.NET Framework、.NET Framework SDK,以及开发环境(最初是 Visual Studio .NET,然后是 Visual Studio .NET 2003,现在则是 Visual Studio 2005)。

.NET Framework 为应用程序提供一组核心功能。它提供在托管环境中运行代码所需的服务和其他功能。.NET Framework SDK 是一组创建托管应用程序的基本工具,包括编译器和许多其他有用的工具。Visual Studio 2005 构建于 Framework SDK 提供的一组基本工具之上。Visual Studio 是开发面向 .NET Framework 应用程序的首要工具。

一些开发人员和 IT 专业人员将 .NET Framework 描述为一个平台,但其他人坚持认为 .NET Framework 不是一种平台,而是更广阔平台(即 Microsoft Windows)中的一个构造块或组成部分。事实上,.NET Framework 和 .NET Compact Framework 既是平台,又是它们所处的更广阔平台(如 Windows Server 2003 或 Windows CE)中的构造块。这些更广阔的平台在通常也称作是平台的硬件上运行。在本书中,为了避免混淆众多术语平台的使用,则不将 .NET Framework 称为平台。

公共语言运行库和中间语言

每个程序都在一个上下文中运行。DOS 程序运行于 16 位 MS-DOS 操作系统提供的服务上下文。诸如 Microsoft Word 这样的应用程序运行于当前操作系统的上下文,而且受到由操作系统强制的约束和提供的服务(如为用户帐户授予的权限)的限制。例如,在 Windows XP 和 Windows Server 2003 中,应用程序只能限制性地访问文件系统,原因是操作系统在安全的上下文中运行应用程序并使用访问控制列表 (ACL) 保护文件系统。

CLR 是 .NET Framework 的一个核心组件,它为托管代码提供上下文并执行该代码。在某些方面,CLR 是个虚拟机,但 CLR 的功能扩展并超越了简单的虚拟机模型。CLR 对其上下文具有内置的理解能力,并能够根据自身所处环境做出适当的响应。例如,CLR 在 Windows 98 和 Windows Me 环境中的行为与它在 Windows XP 或 Windows Server 2003 中的行为不同,是由于这两个系列的操作系统(基于 MS-DOS 的操作系统和基于 Windows NT 的操作系统)有根本的区别。CLR 在多处理器环境中也有不同的行为,从而利用多 CPU 带来的好处。

CLR 是一种称为公共语言基础结构 (CLI) 的标准实现,CLI 定义一个独立于机器的环境,应用程序可以在其中执行。CLR 虚拟执行系统提供诸如内存管理(对象生存期管理和垃圾回收)和安全性这样的重要服务。CLR 还提供实时 (JIT) 编译器,用于将中间语言转换为可由物理 CPU 执行的本机代码。

中间语言 (IL) 是一种旨在不同类型设备上高效转换为本机代码的新语言。IL 基于一种以抽象堆栈为基础的处理器体系结构。它是 .NET Framework 的通用语言。Visual Basic 编译器 (vbc.exe) 生成 IL。C# 编译器 (csc.exe) 生成 IL。事实上,每个与 .NET 兼容的编译器均生成 IL。中间语言是一种比 Visual Basic 或 C# 更低级的语言。对于具有机器汇编语言背景的编程人员而言,IL 容易让人想起汇编语言,但它是一种更高级别的抽象。

.NET Framework SDK 包括的工具之一是 Ildasm.exe,即 IL 反汇编程序。Ildasm 用于以可读形式显示 .NET 程序文件的内容。图 1-2 显示一个简单 Windows 应用程序的 Ildasm 的部分输出。


1-2 显示一个简单 Windows 应用程序的 Ildasm.exe。

Ildasm 可用于查看单个函数和子例程(在面向对象语言中也称作方法)内的 IL。图 1-3 显示 Form1_Load方法的 IL 清单。下面的代码是原始的 Visual Basic 源代码:

Private Sub Form1_Load(ByVal sender As System.Object, _ 
ByVal e As System.EventArgs) Handles MyBase.Load 
Dim I As Integer 
Dim S As String 
For I = 1 To 20 
S += I.ToString() + ““ 
Next 
MsgBox(S) 
End Sub

1-3 一个简单子例程的 IL 清单。

.NET Framework SDK 还包括一个汇编程序 Ilasm。您可以在喜爱的文本编辑器中键入中间语言,然后使用 Ilasm 对其进行汇编。之后就可以在 CLR 中执行已汇编的 IL。虽然对某些人而言,这肯定是一个具有指导意义的练习,但是大多数专业编程人员发现,用 Visual Basic、C# 或其他高级编程语言编程,然后使用与 .NET 兼容的编译器生成 IL 更加方便。

中间语言有时也称为 Microsoft中间语言 (MSIL) 或公共中间语言 (CIL)。MSIL 通常读作“missile”。

如果稍微考虑一下,所有与 .NET 兼容的语言都编译为 IL 且 CLR 执行 IL,就会发现无论使用何种原始的高级编程语言,所有托管代码对 CLR 而言都是相同的。所有语言都是一流的语言。任何与 .NET 兼容的语言都可以访问 Framework 类库。每个 .NET 编程人员都可重用由任何与 .NET 兼容的语言创建并经过编译的 IL。

这并不是说任何与 .NET 兼容的语言都是等价的。一些语言在解决特定问题时比其他语言更合适。图 1-4 显示的解决方案包含一个用 Visual Basic 编写的 Windows 应用程序,从 C# 编写的类库调用方法 GetNumberListString。Visual Basic 和 C# 都编译为 IL,因此这两种语言的运行速度从本质上难分伯仲。但是,对于语义相同的高级代码,不同的编译器设置可能会导致产生不同的 IL。如果使用默认的编译器设置,则 C# 中的 for 循环将比 Visual Basic 中的等效循环运行得更快,因为 Visual Basic 编译器在默认情况下包括溢出检查,而 C# 编译器则不包括(一个典型的安全与速度的折中)。如果编写具有高迭代循环的代码,可使用 C# 并启用编译器的溢出检查选项,然后将高迭代循环包装在 unchecked 语句块中以关闭特定代码块的溢出检查,从而获得少量的性能提高。Visual Basic 不提供在这种细粒度级别上打开和关闭溢出检查的选项,因此这是 C# 更适合解决某个特定问题的特殊情况之一。(Visual Basic 有自己的一组独特功能,例如 My命名空间和可选的方法参数。)


1-4 调用以 C# 编写方法的 Visual Basic 代码。

前面的例子使用 C# 的循环显然有点做作。由于整数溢出检查的影响很大(当然,除非循环体主要包含整数运算,该操作无需进行溢出检查,因此运行速度更快),因此循环体通常尽可能地简单。不检查整数操作并非 C# 独有 — 您可以将代码导出到一个单独的 Visual Basic 类库并禁用该项目的溢出检查,以获得相同结果的 IL。即使是这个例子也有点做作,但在许多现实的情况下,可以在同一个解决方案中使用多种 .NET 语言。例如,您可以购买 Visual Basic 项目必须调用的第三方 C# 代码。或者您的公司可能像许多开发团队一样,以前的 ASP 编程人员用 Visual Basic 构建 ASP.NET 应用程序,而具有 C++ 背景的 COM 编程人员则用 C# 构建类库以供 ASP.NET 应用程序使用。在这种情况下,可以让编程人员根据其编程背景使用其最擅长的 .NET 语言。

在软件解决方案中混合多种编程语言时要非常谨慎。多种编程语言可能使代码重构(重建)变得困难,并可能使不熟悉所用语言的编程人员(特别是初级编码人员)感到灰心或迷惑。还应该知道区分大小写的语言(如 C#)和不区分大小写的语言(如 Visual Basic)之间的差别。一个 C# 组件公开的公共接口只通过大小写(例如 User- Name 和 username)区分方法、属性或字段,不能象在 Visual Basic 程序中计划的那样使用该接口。

通用类型系统

如果您曾经花费大量时间编写 Visual Basic 6 代码来调用 Win32 API 或第三方 DLL 公开的函数,您就会知道 Visual Basic 6 中的内置数据类型与其他语言(例如 C)中的内置数据类型不同。如果所有 .NET 语言都编译为可从任何 .NET 程序调用的 IL,则必须有一组公共数据类型来表示所有这些语言中的整数、实数、日期和文本等。.NET Framework 使用的数据类型作为通用类型系统的一部分进行定义,通用类型系统是创建和使用数据类型的一组规则。

通用类型系统是确保跨语言集成的基础。Visual Basic 编程人员可完全放心地将 Int32值或 String 传递给 C# 库,因为 Int32和 String 定义为通用类型系统的一部分。通用类型系统还是确保运行时类型安全的基础,确保您的代码不会允许未经授权的内存访问,并且不易受到某些类型的安全攻击。

Visual Basic 有许多映射到通用类型系统中预定义类型的基元数据类型。例如,Visual Basic 的基元类型 Integer System.Int32 的别名,是一个 32 位的整数。Visual Basic 的基元类型 String 是 System.String 的别名,它是一个 Unicode 字符序列。C# 和其他语言都有自己对应于通用类型系统中这些相同预定义类型的基元数据类型。

在 Visual Basic 6 中,Integer 是 16 位值,而 Long 是 32 位值。在面向 .NET Framework 的 Visual Basic 代码中,Integer 是 32 位的,而 Long 是 64 位的。如果使用 Visual Basic 6 升级向导转换代码,则整数数据类型将由该向导为您调整。

对象和值

通用类型系统中有两种数据类型:引用类型和值类型。这两种数据类型在如何创建、如何在内存中传递以及最终销毁方面有着根本的不同。值类型存放通常视为基元的值:整数、浮点数、字符和布尔值(true/false)。值类型一般可以简单地在内存中表示,通常只需要几个字节。当值类型在内存中传递时(例如,当它们作为参数传递给方法时),该值本身被复制(默认情况下)。

值类型简单而高效。它们不需要创建对象所需的相同类型的开销(即引用类型),而且不需要特别考虑析构问题。值直接保存在堆栈中并与一个变量或常量(或文本)相关联。该值的生存期与访问该值的变量的生存期相同。变量不能与其值分离,因此一个值类型的变量总有一个值。与引用类型不同,值类型变量不能为空 (Nothing)

通用类型系统定义了最有用的值类型(Integer、Double、Date 和 Char 等),并允许您定义自己的值类型。您还可以创建枚举,枚举就是自定义的值类型,包含了一些整数类型值(通常为 Integer)的符号别名。只有在枚举定义中指定的别名才是枚举类型变量的有效值。例如,下面的代码清单显示用户类型的枚举。UserType变量只能有(Admin、Moderator 或 User)三个指定值中的一个。

Enum UserType As Integer 
Admin = 1 
Moderator = 2 
User = 3 
End Enum

.NET Framework 类库广泛使用枚举(从文件 I/O 模式到颜色)。

引用类型是一种完全不同的数据类型。引用类型的“值”是分配用来存放该引用类型的实例(即对象)的内存位置的内容。引用类型的值始终通过对存放该值的内存位置的引用来访问。与值类型变量不同,引用类型变量并非内在地与一个始终具有值的固定内存位置相关联。引用类型变量可以是对内存中任何对象(具有适当的数据类型)的引用。或者,引用类型变量可能不存放对任何对象的引用,这种情况称为空引用

CLR 在其运行库内存堆中为对象(引用类型的实例)分配空间。考虑下面的代码:

conn = New SqlConnection(connectionString)

变量 conn 被赋值为对新的 SqlConnection对象的引用。该对象在内存堆中创建。CLR 为新对象分配内存,并为 SqlConnection类调用一个称为构造函数的特殊方法。CLR 还负责在不再使用该对象时销毁该对象并释放其内存。这也称为垃圾回收,它是 CLR 提供的核心服务之一。

当引用类型作为参数传递给方法时,引用是按值传递的。这就意味着复制是对引用而不是对象值本身(在内存堆中)进行的。原始的调用代码和调用的方法都将存放对内存中相同对象的引用。如果此方法更改该对象的内容,此更改将影响调用代码。考虑以下 Visual Basic 代码:

Sub CreateDataSet() 
Dim ds As New DataSet 
AddTable(ds) 
’ 
’The message box displays “”because the AddTable method 
’has changed the DataSet object ds. 
’ 
MsgBox(ds.Tables.Count.ToString()) 
End Sub 
Sub AddTable(ByVal targetDataSet As DataSet) 
targetDataSet.Tables.Add(“TableOne”) 
End Sub

变量 ds 是对一个新 DataSet对象的引用,该引用被传递给 AddTable方法。在 AddTable方法中,变量 targetDataSet是对相同的 DataSet对象的引用。AddTable方法向 DataSet中添加一个新表。然后返回到 CreateDataSet,在调用 AddTable 之后,DataSet对象 ds 将在其 Tables 集合中拥有一个表。两个方法都使用内存中相同的 DataSet对象,即使在这两个不同的方法中存在两个不同的变量。

类、方法、属性、字段和事件

在面向对象的编程中,对象是类的实例。作为一名编程人员,您可以定义具有数据字段、属性、方法和事件的类。然后可以基于这一具有状态(字段、属性)和行为(方法、事件)的类创建对象。以 Form类为例。Form类为将在 Windows 应用程序中显示的窗口定义数据和属性(例如 Width)。Form类还定义诸如显示窗体的 Show 方法这样的行为。Form类本身不是一个窗体。该类定义 Form对象的外观以及它的功能。实际的 Form对象是处于内存堆中特定内存位置的字节序列。

一个类由四个构造块组成:字段、方法、属性和事件。字段是类存放的值。字段可以直接存放值(值类型)或存放值的引用(引用类型)。类中的字段类似于方法中的变量。方法调用期间变量中的值是该方法调用状态的一部分,该变量与该方法的一个“实例”相关联。同样,字段是对象(即类的实例)状态的一部分。

方法是类中的功能单元。Visual Basic 中的子例程 (Sub) 和函数 (Function) 是方法。方法是对象行为的重要部分。方法是对象可以做的事情。它是在对象的上下文中执行的编程逻辑块,而且它可以通过其字段和属性访问或操作对象的状态。

属性是字段和方法之间的混合。与字段一样,属性是对象状态的一部分。对于其他对象而言,公共属性看起来与公共字段一样,您可以使用相同的语法读写属性值。但在内部,属性实际上是两个特殊的方法:一个 Get 过程和一个 Set过程。当您读取属性值时,执行 Get 过程。当您设置属性值时,执行 Set过程。属性允许您拥有与访问值相关的逻辑。更重要的是,属性允许您将对象的公共接口与其数据的内部表示相分离。

事件是对象可以响应的情况。事件是对象可以展示的另一种行为。如果方法是对象可以做的事,事件就是对象可以说的话。事件通常用于向侦听对象通知状态的改变。侦听对象通过事件处理程序得到“通知”。侦听对象将方法注册为特定对象的特定事件的事件处理程序。然后,在事件发生时自动调用该方法(事件处理程序)。事件在对象显式引发它们时发生。例如,当 Button 对象接收到来自 Windows 的消息,指示如果鼠标指针位于默认鼠标按钮之上就按下该按钮时,引发 Click 事件。如果您已用 Visual Basic 6 编写过程序,那么您就应该熟悉事件驱动编程。您将发现,托管代码中事件处理程序的工作方式有一些不同,但是在许多情况下,编写的代码与您在 Visual Basic 6 中编写的代码非常类似。

在 Visual Basic 中编写托管代码时,始终要创建一个类,它是数据类型的定义。该类型对象的状态和行为均由代码决定。下面的例子是一个名为 UserAddress 的类。该类包含存放邮件地址元素的四个字段。在本例中,这些字段都标记为 Private,这意味着它们不能从 UserAddress类外部访问。而数据使用四个属性公开。UserAddress中的属性是私有字段的简单包装,但此处最重要的是,该地址的外部(公共)接口与存放数据的实际字段是分离的。您可以自由改变数据的内部表示方式而继续公开相同的外部接口。这个例子还包括一个称为 AddressChanged 的事件。如果新值不同于旧值,则每个属性中的每个 Set过程都将引发该事件。侦听对象可以为 AddressChanged事件注册处理程序,并在 UserAddress状态改变(即地址的某些部分改变)时执行代码。最后,GetFormattedAddress方法创建了一个包含所有地址数据的 String 对象。

Public Class UserAddress 
Private _address As String 
Private _city As String 
Private _provState As String 
Private _postalCode As String 
Public Event AddressChanged() 
Public Property Address() As String 
Get 
Return _address 
End Get 
Set(ByVal Value As String) 
If _address <> Value Then 
_address = Value 
RaiseEvent AddressChanged() 
End If 
End Set 
End Property 
Public Property City() As String 
Get 
Return _city 
End Get 
Set(ByVal Value As String) 
If _city <> Value Then 
_city = Value 
RaiseEvent AddressChanged() 
End If 
End Set 
End Property 
Public Property StateProvince() As String 
Get 
Return _provState 
End Get 
Set(ByVal Value As String) 
If _provState <> Value Then 
_provState = Value 
RaiseEvent AddressChanged() 
End If 
End Set 
End Property 
Public Property PostalCode() As String 
Get 
Return _postalCode 
End Get 
Set(ByVal Value As String) 
If _postalCode <> Value Then 
_postalCode = Value 
RaiseEvent AddressChanged() 
End If 
End Set 
 
End Property 
Public Function GetFormattedAddress() As String 
Return _address + vbCrLf + _ 
_city + “, “+ _provState + vbCrLf + _ 
_postalCode 
End Function 
End Class

UserAddress类是可在 Visual Basic 中创建的数据类型的一个简单例子。构建 .NET Framework 应用程序是将需求转化为类的过程,各个类进行交互来实现期望的功能。有时您不得不自己编写整个类,例如 UserAddress类。有时类通过向导或一些其他工具自动创建,例如向应用程序中添加一个新的窗体时。

您需要在应用程序中完成的任何事情都将通过类来实现。需要表示一个客户的对象?创建一个类。需要将数据从旧式系统迁移到 Microsoft SQL Server 数据库的功能?创建一个类。如果您在设计类时考虑到重用,最后您将拥有一组可以复制到新应用程序中的类。.NET Framework 本身就包含一个旨在在许多类型的应用程序中进行重用的大类库。这个类的集合也称为 Framework 类库,它是自 .NET Framework 引入以来最为流行的一大特色。

在一些面向对象的编程语言和抽象对象模型中,术语字段 (field) 与属性(property 和 attribute)可交替使用。在 .NET Framework 中,属性是不同于字段的特定构造。

Framework 类库

面向执行环境(如 CLR)的高级编程语言(如 Visual Basic)是一个强大的概念,但它必须辅以一组同样强大的库才能在现实世界中真正有用。Framework 类库 (FCL) 有时也称作基类库 (BCL),它是一组 DLL,是 .NET Framework 的一个组成部分。每个 DLL 都包含一组相关的类以提供某个特定功能。例如,System.Drawing.dll 提供了生成图形的类;System.DirectoryServices.dll 提供了与 Active Directory 交互的类;而 System.Xml.dll 提供了使用 XML 文档的类。Framework 类库包含的内容从基本的文件 I/O 到构成 ASP.NET 和 ADO.NET 的类,无所不有。

大多数开发人员发现,要成为一名精通 .NET 的开发人员,首要任务是学习 Framework 类库。该任务的一部分就是学习使用新方法来解决旧问题。其中最重要的一部分是学习 Framework 类库中的许多新功能,这些功能以前需要很多自定义代码或者第三方组件。要 Ping 一个服务器,可以使用 Ping 和 PingReply类。要以编程方式访问一个 Web 站点,可使用 WebClient或 HttpWebRequest类。要验证电子邮件地址的格式,可使用 Regex类。要转换一个 XML 文档,可使用 XslTranform类。要以编程方式发送一封电子邮件,可使用 SmtpMail类。

Framework 类库非常全面,.NET 开发人员也承认,他们常常花费更多的时间研究和查找 Framework 类库中合适的类来完成通用任务(例如,将 PNG 图像转换为 JPG 图像),而将更少的时间用于编写自定义的代码来完成这样的任务。使用 Framework 类库来完成这些任务意味着只需要测试、调试以及维护更少的自定义代码,并能够从世界上其他使用完全相同的类完成相同通用任务的开发人员那里获得预编写的文档和支持。

本书以最新的 Framework 类库功能为重点,这些功能是在 .NET Framework 2.0 版中引入。对于 Framework 类库中更多已经确定的部分,有许多很好的资源可提供更深入信息,包括随 Visual Studio 2005 一起安装的 MSDN 文档、MSDN Web 站点 (http://msdn.microsoft.com/) 上的信息、通过搜索 http://www.google.com/ 可以找到的信息,以及 101 MicrosoftVisual Basic.NET Applications(Microsoft Press 提供)。

命名空间

Framework 类库是按照命名空间的层次结构组织的。命名空间提供一种方法来组织各个类,以帮助避免二义性,减少命名冲突,以及将相关的类组合在一起。如果没有组织结构,则命名冲突将频繁发生,从而使人感到不快。如果您正在编写页面布局程序,则可能想创建一个类来表示页面上的一块文本;但如果您试图创建 TextBox类,则将与为 Windows 窗体定义的 TextBox类冲突。如果您正在编写一个管理合法窗体的工具,则可能想创建一个类表示窗体;但如果您试图创建一个 Form类,则将与 Framework 类库中现有的 Form类冲突。已经使用了 Url?。已经使用了 Semaphore?。Ping?Timer?Thread?全部都已经在 Framework 类库中使用了。该列表可以更长 — Framework 类库范围广泛。幸运的是,Framework 类库使用命名空间以避免命名冲突。实际上,Framework 类库本身也在不同的命名空间中重复使用一些类名。最值得注意的是,用户界面控件(如 TextBox、ListBox 和 Button)同时出现在 System.Windows.Forms和 System.Web.UI.WebControls命名空间中(不过这两个命名空间一般不在相同的应用程序中一起使用)。

正如前面所提到的,Framework 类库范围广泛,掌握它不是一件轻而易举的事情。命名空间使得利用 Framework 类库容易了许多,因为具有相关功能的类通常可以在同一个命名空间中找到。如果需要处理数据,可查看 System.Data命名空间。如果需要使用 XML,可查看 System.Xml命名空间。如果需要读写文件,可查看 System.IO命名空间。熟悉 System 命名空间之下的各个命名空间(包括一些最知名的类)将使您成为更高效的 .NET 编程人员,因为当查找提供所需某个特定功能的类时,您能够快速确定需要搜索哪个命名空间。

当使用 Visual Studio 创建应用程序时,类将放置于与应用程序名称相同的命名空间中。可通过如图 1-5 所示的 Visual Studio 2005 项目属性窗口更改默认的根命名空间。命名空间可以嵌套,因此可在代码中创建其他的命名空间,这些命名空间将放置于命名空间层次结构中项目的根命名空间之下。当应用程序或类库中类的数目增加时,您将发现为各组相关的类创建命名空间非常有用,它们能够将类组织得更有条理。如果应用程序的根命名空间是 ChooseYourOwnNamespace,下面的代码将在命名空间 ChooseYourOwnNamespace.Namespace1 中定义一个名为 Class1 的类:

Namespace Namespace1 
Public Class Class1 
End Class 
End Namespace

1-5 显示项目根命名空间设置的项目属性窗口。

除非为编译器提供其他信息来解析类名,否则类必须使用其完全限定名进行引用。完全限定名是以其命名空间开头的类名。如果命名空间嵌套在另一个命名空间内,则这些命名空间的完整列表都必须包含在完全限定名之中。前面例子中类的完全限定名是 ChooseYourOwnNamespace.Namespace1.Class1。当然,有一些您经常使用的公共命名空间,一次又一次地键入这些完全限定名只会使您的源代码变得混乱。除了键入完全限定名之外,还可选择将命名空间导入到整个项目或单个代码文件中。图 1-6 显示通过项目属性窗口导入到整个项目中的命名空间。图 1-7 显示使用 Imports 语句导入到代码文件中的几个命名空间。


1-6 为项目导入的命名空间。


1-7 为单个代码文件导入的命名空间。

程序集和元数据

应用程序是功能的集合。类是构成应用程序整体功能的构造块。整体功能必须进行捆绑以使其能够保存在存储介质(例如硬盘或 DVD)中,部署到其他计算机,由执行环境(例如 CLR 或操作系统,分别针对托管代码和非托管代码)加载,而且在一些情况下可以被多个应用程序重用。这些功能“束”称为程序集(如果它们面向 .NET Framework)。在基于 Windows 的环境中,有两种类型的文件可以封装功能:可执行文件(EXE 文件)和库(DLL 文件)。程序集通常是一个 EXE 或 DLL 文件,虽然也可以创建多文件程序集。使用 Visual Studio 2005(以及 Visual Studio .NET 和 Visual Studio .NET 2003),您既可以创建 EXE 程序集,又可以创建 DLL 程序集。

程序集是托管代码的版本控制单元和部署单元。如果一个应用程序由一个可执行文件(EXE 文件)和一个库(DLL 文件)组成,您就有两个程序集,两者都有其各自的版本号。您可以同时部署这两个文件,然后部署更新的 DLL 而不用部署更新的可执行文件。

程序集由三部分组成:中间语言、元数据和资源。正如前面提到的,.NET 编译器不生成二进制机器代码,而是生成中间语言。程序集中的 IL 由 JIT 编译器实时(换句话说,在运行时需要该代码时)转换为二进制机器代码。 JIT 编译代码保存在内存中,以便随后执行当前进程的代码时可以重用该 JIT 编译代码。JIT 编译与解释代码有很大的不同。IL 可以相对容易地转换为本机代码,并且可以在运行时针对可用的硬件和资源进行优化。较小的预先编译开销可以为当前环境产生优化的二进制代码。

存储在程序集文件中的元数据称为清单。清单包括程序集版本、对其他程序集的引用、支持的区域性、类型信息,以及其他关于程序集的自描述信息。

程序集中的资源是嵌入到程序集自身中的内容文件,可在运行时访问。嵌入资源最常见的用法之一是图像文件。下面的代码示例显示如何从当前程序集中读取嵌入的 JPG 图像并在 PictureBox控件中进行显示。在本例中,嵌入的资源是 Image1.jpg。程序集的根命名空间是 MyApp。

Private Sub LoadResourceImage() 
Dim currentAssembly As System.Reflection.Assembly 
currentAssembly = System.Reflection.Assembly.GetExecutingAssembly() 
Dim img As System.IO.Stream 
img = currentAssembly.GetManifestResourceStream(“MyApp.Image1.jpg”) 
PictureBox1.Image = Image.FromStream(img) 
img.Close() 
End Sub

虽然所有的托管代码都打包在程序集中,但可根据程序集的类型(EXE 或 DLL)以及程序集的加载方式得到不同类型的应用程序。Windows 应用程序是由 Windows 外壳加载的 EXE 文件。Web 应用程序是包含由 IIS(Internet 信息服务)加载的特定类型类的 DLL 文件。本章稍后将更详细地讨论 Windows 和 Web 应用程序,包括 Visual Basic、COM、和 ASP 的各个版本之间的区别,以及 .NET Framework 2.0 中引入的重要新功能。

数据访问:ADO.NET

数据访问是许多应用程序不可缺少的功能。当您开始学习编程时,可能看到或听到过这样的说法:一个没有输入输出的程序是没有用的(至少不是非常有趣的)。应用程序的一个输入源是数据源,例如 SQL Server 数据库、Microsoft Access 数据文件或 XML 文档。多年来,Visual Basic 编程人员接触过几种数据访问技术,包括 DAO、RDO 和 ADO。如果您曾在 Visual Basic 6 中编程,则已经使用过 ADO 从 OLEDB 数据源(例如 SQL Server 数据库)中读写数据。ADO 是为了在互连环境中使用关系数据而设计的。虽然向 ADO 中添加了对中断连接的记录集的支持,但这非常有限。ADO.NET 数据访问 API 是作为 Framework 类库中不可缺少的一部分引入的,旨在提供对中断连接情况的更好支持以及最好的 XML 支持。

中断连接的数据是 ADO.NET 中的核心概念。虽然没有 Recordset,但 System.Data命名空间中的很多类提供了比 Recordset更多的处理数据的选项。ADO.NET 中的核心类是 DataSet。DataSet对象包含一个 DataTable对象的集合(而且可以包含 DataRelation对象以定义 DataTable对象之间的关系)。DataTable包含一个定义 DataTable结构的 DataColumn对象的集合。它还包含一个为 DataTable存放数据的 DataRow对象的集合。DataSet及其包含的对象都是泛型的,与基础数据源完全断开连接。

DataSet 的填充有几种方法,包括选择以编程方式创建一个 DataTable及其 Columns 集合,然后编写代码向 Rows 集合中添加 DataRow对象。Visual Studio .NET 2003 中更常用的方法是,基于从数据源返回的数据的结构使用另一个称为数据适配器 的对象来创建 DataTable对象。这是 ADO.NET 开始特定于数据源的地方。数据适配器是所谓托管提供程序的一部分,托管提供程序是针对数据源的特定类型的一组类。SqlClient托管提供程序用于访问 SQL Server。OleDb托管提供程序用于访问任何 OLEDB 数据源。还有另外一些托管提供程序,可用于其他类型的数据源(例如,ODBC 和 Oracle)。托管提供程序定义连接、命令、参数、数据库类型和数据适配器的类,以及几个其他有用的类。下面的代码显示如何从 SQL Server 数据库填充 DataSet:

Dim conn As New SqlConnection 
conn.ConnectionString = _ 
“server=(local);database=Northwind;Trusted_Connection=True" 
Dim adapter As SqlDataAdapter 
adapter = New SqlDataAdapter(“SELECT * FROM Products", conn) 
Dim dsProducts As New DataSet 
conn.Open() 
adapter.Fill(dsProducts) 
conn.Close()

要向数据源提交对 DataSet所做的更改,您可以使用数据适配器的 Update 方法。要进行更新,数据适配器必须有可用的命令对象(例如 SqlCommand 和 OleDbCommand 等)进行数据的插入、更新和删除。您可以自己创建命令对象,也可以使用命令生成器对象在运行时自动生成命令对象,或者可使用 Visual Studio .NET 2003 中诸如数据适配器配置向导这样的工具自动生成创建命令对象的代码。

数据适配器配置向导在 Visual Studio 2005 中仍然可用;然而,您只应该将它用于编辑从 Visual Studio .NET 2003 转换而来的代码中已经存在的数据适配器。有一些用于数据访问的新工具和功能,我们将在第 4 章“构建以数据为中心的应用程序”中对其进行讨论。

在完成 DataSet对象填充之后,它可以传递到应用程序的不同部分 — 甚至是分布式组件,因为 DataSet类是断开连接的且忽略任何数据源。DataSet的灵活性以及中断连接的特性使其更易于构建传送数据的分布式应用程序,并且更易于支持重要的智能客户端方案(如脱机使用)。

Visual Studio 2005 和 .NET Framework 2.0 为数据访问任务引入一些新的选项,例如填充 DataSet。大多数情况下,在 Visual Studio 中编写数据访问代码时不会使用数据适配器。相反,您会使用数据源并通过表适配器填充 DataSet对象。支持它们的这些新功能和新工具(如数据源配置向导)将在第 4 章中详细讨论。

Windows 应用程序

自 Visual Basic 引入之时起,Windows 应用程序开发就成为其标志。虽然使用 Visual Basic 开发的 Windows 应用程序在编译和执行方式方面有许多改变,但是您从 Visual Basic 6 中获得的大部分开发技能都将转移到使用 Visual Studio 的 Windows 开发中。

Visual Basic 6 和 Visual Basic 2005 的异同

如果您曾使用 Visual Basic 6(或更早版本)构建应用程序,就会很熟悉使 Visual Basic 非常流行的可视化设计和事件驱动功能。Visual Studio 2005 延续其易于使用的可视化设计体验以及事件驱动模型。

用于 Windows 应用程序的 Visual Studio 2005 设计器保留了 Visual Basic 6 中足够多的可视化设计器外观,这样您就可以轻松上手。图 1-8 显示 Visual Studio 2005 中设计视图的一个窗体示例。您可以可视化地定位控件,从工具箱中添加新控件,在“Properties”窗口中编辑属性,然后双击控件以编写事件处理程序。


1-8 Visual Studio 2005 可视化的 Windows Form 设计器.

虽然该设计器乍一看似曾相识,但是其许多增强功能使得 Windows Form 开发更加容易,而且为您提供更多强大的功能和灵活性。Visual Basic 6 最重要的改变之一就是,所有控件和其他 UI 组件实际上都是 Framework 类库中的类。当将一个 TextBox拖到窗体上时,Visual Studio 2005 会自动生成一个字段来存放对 TextBox对象的引用,并编写在窗体初始化时实例化 TextBox对象的代码。可视化设计器还编写设置控件属性的代码。如果更改了“Properties”窗口中 Text- Box 的 BackColor属性,Visual Studio 2005 将生成一行 Visual Basic 代码来设置 BackColor。图 1-9 显示一些为图 1-8 中显示的登录窗体自动生成的代码。


1-9 由 Visual Studio 2005 设计器生成的代码。

Visual Basic 6 中的另一个重要改变是,任何窗体和控件都是类的一个实例。当使用可视化设计器创建一个新的窗体时,就定义了一个新类。但不需要您自己实现窗体所需的全部功能。System.Windows.Forms命名空间中有一个现有的类 Form,它提供具有 Size 和 BackColor 等属性的窗体的基本功能。当创建一个新窗体时,就继承了 Form 基类的功能。LoginForm1.vb 的前两行(图 1-9)举例说明了如何创建继承其他类功能的类:

Public Class LoginForm1 
Inherits System.Windows.Forms.Form

当在窗体上放置了一个名为 btnOK 的按钮时,实际上就为指定的窗体类创建了一个字段,该字段存放运行时对 Button 对象的引用。可视化设计器还生成操作 Button 控件状态的代码,以将其放置于窗体的适当位置,并设置其标题(即 Text 属性),等等。当在可视化设计器中双击 Button 控件以编写代码时,设计器就创建了一个注册为 btnOK 的 Click 事件的事件处理程序。您还可以向窗体类中添加自己的事件和属性。实际上,任何可通过类进行的操作都可以通过窗体进行,因为窗体就是一个类。

窗体的所有细节均包含在 .vb 代码文件中。Visual Studio 2005 提供一个极好的设计环境,可用于可视化地创建和编辑这些 .vb 文件。还可以手工编写 .vb 文件的代码,甚至在纯粹的文本编辑器(如 Notepad)中进行编码。

在 Visual Basic .NET 中打开一个窗体的方式有很大的不同。在 Visual Basic 6 中,创建一个 .frm 文件,例如 Form1.frm。窗体的名称是 Form1,可键入 Form1.Show 打开该窗体。在 Visual Studio 2005 中,文件名是不相关的。重要的是 .vb 代码文件中所定义类的名称。假设类名为 Form1。如果要打开 Form1,则需要创建该类的一个实例,然后调用此实例的 Show 方法,如下面的代码块所示:

Dim f As New Form1 
f.Show()

.NET Framework 显著地改变了 Windows 开发的前景。.NET Framework 2.0 版中引入的新功能可以提高工作效率,并使您能够在构建 Windows 应用程序时访问更为丰富的功能集。

Visual Basic 2005 中的重要新功能

Visual Basic 2005 中有很多新功能,例如设置控件内部(具体来说就是控件的内部间距)和控件边缘填充的选项。这些属性从 Control 基类继承,所以它们对任何控件类型都可用。有一些新控件和设置可用于创建具有专业外观的用户界面和自定义产品(如 Microsoft Office)支持。还有一些新的面板控件支持流和表布局。后面的章节(包括第 5 章“构造用户界面”)将更详细地讨论这些增强功能以及其他一些增强功能。

一个极为有用且十分流行的新 RAD 功能是对齐线,这是 IDE 中可视化窗体设计器的一个功能(而不是一种语言或 Framework 类库功能)。如果您花费过很多时间使用 Visual Basic 6 或者 Visual Studio .NET 2003 构建用户界面,您就会了解,如果不通过手工编辑属性值,要完全对齐控件是如何困难。Visual Studio 2005 中的可视化设计器包括新的可视化对齐参考线(对齐线),当将控件放置到窗体中时,对齐参考线可以帮助您在水平和垂直方向对齐控件。图 1-10 显示一个对齐参考线示例,其中,对齐参考线帮助开发人员将 OK 按钮与一些其他控件垂直对齐,并与另一个控件水平对齐。


1-10 Visual Studio 中的控件对齐参考线。

Web 应用程序

Visual Studio .NET 发布之前,使用 Visual Basic 构建 Web 应用程序需要多种工具和多种开发语言。Visual Studio .NET 引入一个统一的开发环境和一个新的 Web 编程模型,允许 Visual Basic 编程人员将其 Windows 开发技能应用于 Web 开发。Visual Studio 2005 引入了许多使用 .NET 技术进行 Web 开发的重要增强功能。

ASP、ASP.NET 1.0 和 ASP.NET 2.0 之间的异同

如果这是您第一次接触 ASP.NET,欢迎来到 Web 开发的新世界!ASP.NET 是 Framework 类库不可缺少的一部分。它为应用程序提供一个面向对象的事件驱动基础结构,使其可以宿主于 Web 服务器,从而响应 Web 请求(即向 Web 浏览器提供内容)。

ASP.NET 2.0 的发布是一件特别激动人心的事情,因为它极大地提高了工作效率,并大幅度地减少了代码量。ASP.NET 1.0 代替了极为麻烦的 ASP/COM 开发。大家也开始认识到,传统的 ASP 难以进行调试和维护。任何内容都是经过解释的脚本,所以其性能很低,除非您将一些计算密集的处理移到 COM 组件中。如果使用 COM 组件,则必须使用多种开发环境,并用多种编程语言编写 — 通常是 VBScript 以及用于 COM 组件的 Visual Basic 6 或 C++。当然,使用 COM 组件需要在 Web 服务器上注册组件,这就给部署添加了一层复杂性。在共享宿主和虚拟主机环境中,通常根本就不允许您注册 COM 组件,使得许多开发人员只能选择使用脚本。而您或许知道,VBScript 不允许强类型,这就意味着即使简单的语法错误也必须在运行时发现和诊断,而不是在编译的过程中发现,因为脚本是经过解释的。

与 ASP 不同的是,ASP.NET Web 应用程序首先编译为 IL,然后 IL 实时编译为本机二进制代码。与 Windows 应用程序一样,首先进行 JIT 编译,然后缓存本机代码,以便将来重用。因为代码是实时编译的,所以第一次 Web 请求会有一些较小的延迟。在第一次请求之后,ASP.NET Web 应用程序与基于脚本的 Web 技术相比在性能方面的提高会给人以更加深刻的印象。仅此功能就足以说明迁移到 ASP.NET 是能够令人信服的。但是还有很多其他的好处。

ASP.NET 为 Web 应用程序提供一个面向对象的事件驱动框架。Web 页是继承 Page 基类基本功能的类,就像 Windows 窗体继承 Form基类的功能一样。当您请求一个 Web 页时,系统将该类的一个实例加载到内存,接着调用一系列方法,然后引发一系列事件。可以为事件编写事件处理程序,例如 Page.Load和 Page.PreRender,以在页面处理中插入自定义的逻辑。处理结束后,产生的 HTML 输出将发送给用户。

ASP.NET 的处理模型完全不同于 ASP。在传统的 ASP 中,HTML 和脚本混合在一起,并按顺序处理(自顶向下)。动态内容是使用 Response.Write语句或呈现块(例如,<%= Now %> 显示当前的日期和时间)注入的。所得到的 HTML 和脚本组合可能难以阅读和调试。相反,ASP.NET 使用对象、方法和事件来生成输出。这样可以使代码和内容更好地分离,并产生一个更为丰富的编程模型。

ASP.NET Web 页或 ASPX 页由页面指令、HTML 内容、服务器控件标记以及代码组成。页面指令是特殊的 ASP.NET 指令,用于控制诸如输出缓存这样的内容,打开 Option Strict,引用组件,以及导入命名空间。服务器控件是映射到 Framework 类库中的类的特殊标记元素(即,标记)。当 ASPX 页编译为类时,服务器控件就成为该类的字段。适当控件类的实例在运行时创建,对这些对象的引用赋值给页面上各个服务器控件的类字段。然后要求每个字段引用的对象通过其 Render 方法产生其 HTML 输出。从 ASPX 页得到的 HTML 输出是来自页面本身的 HTML 输出加上每个服务器控件生成的 HTML 输出。

在 ASP.NET 中,还可以使用 Response.Write 生成输出,但是事件驱动的处理模型使得难以使用 Response.Write,除非所有内容均由 Response.Write 生成(ASP 样式),而这将失去面向对象的事件驱动模型的好处。

下面的 ASPX 标记显示一个简单的 Web 页,该页包含 TextBox服务器控件。

<%@ page language="VB”%> 
<html> 
<body> 
<form id="form1”runat="server"> 
<asp:TextBox ID="txtName”Runat="server”/> 
</form> 
</body> 
</html>

当呈现该 Web 页时,TextBox控件以 HTML <input> 标记的形式呈现自己,如下所示:

<html> 
<body> 
<form method="post”action="Default.aspx”id="form1"> 
<div style="display:none"> 
<input type="hidden”name="__VIEWSTATE” 
value="/wEPDwULLTIwNDAwODk2OTNkZLcvFD+nrIIdGTNg9IaMLK9y8exu”/> 
</div> 
<input name="txtName”type="text”id="txtName”/> 
</form> 
</body> 
</html>

服务器控件最大的好处之一就是,可以将复杂的行为封装在服务器控件中,然后在 Web 页上只使用一个标记。诸如 Calendar、Grid-View 和 SiteMapPath这样的控件都是复杂服务器控件的例子,它们可以生成大量的 HTML 输出,而只需使用一两行 ASPX 标记即可。习惯于使用封装复杂功能的控件的 Visual Basic 6 编程人员当然对此概念非常熟悉。由于这样那样的原因,很多 Visual Basic 6 编程人员已经发现,使用 .NET Framework 在 Windows 开发和 Web 开发之间进行技能转移的级别非常高。

ASP.NET 编程和处理模型与 Windows Form 的编程和处理模型相似,这使得 Windows 编程人员转变为 Web 编程人员变得从未有过的简单。例如,Page.Load事件类似于 Windows 编程中的 Form.Load事件。当然,在操作 Web 页时还需要考虑其他一些事项,但是它们都不难于掌握。(例如,窗体级别的字段值在请求之后不能存活。)事实上,使用 Visual Studio 2005 的 Web 编程人员利用 Windows 编程时的相同技能也可以达到很高的工作效率,即使他们对 HTML 的知之甚少(甚至不了解 HTML)。

ASP.NET 2.0 的重要新功能

.NET Framework 2.0 引入了相当多用于 Web 应用程序的新功能。其中包含新的成员身份和用户配置文件子系统,它们为管理用户和对其进行身份验证、进行基于角色的授权以及存储用户信息(例如地址信息)提供了重要的增强支持。还有与新的成员身份系统相关联的新安全控件,例如 Login 和 LoginView控件。有了 ASP.NET 2.0,无需编写任何代码就可实际创建具有内置身份验证的 Web 站点(包括用户数据库)!只需添加几行标记,就这么简单!

新的数据源控件使您能够以声明的方式指定数据源设置,而不是编写公共数据访问代码。还有许多新的数据控件和对现有数据控件的增强 — 最值得注意的是能够将数据控件绑定到数据源控件,以创建功能丰富、数据驱动、零代码的 Web 站点。现在所有的 Web 服务器控件都是设备识别的。.NET Framework 1.1 具有专门用于受限设备(如基于手机的浏览器)的单独移动控件。作为一名 Web 开发人员,您不必再使用不同的控件来支持不同类型的设备。然而,设计界面时,您可能需要考虑一下将支持的设备类型。ASP.NET 2.0 中还有更多的新功能。在本书后面的部分中,您将看到更多的增强功能,特别是在第 6 章“构建 Web 应用程序”。

Visual Studio 2005 和 .NET Framework 2.0 中的增强功能

编写面向 .NET Framework 的代码有许多很好的理由,如曾经在本章开头提到过的工作效率、安全性和“可部署性”。开发人员已经发现,当他们面向 .NET Framework 并使用 Visual Studio 进行开发时,可以更快地编写出更好的代码。Visual Studio 2005 是 Visual Studio 发展过程中的下一步。Visual Studio 2005 和 .NET Framework 2.0 包含很多有趣且激动人心的增强功能,本书其余部分将对此进行详细叙述。下面几节提供了一些例子。

Visual Basic 增强功能

Visual Basic 中有很多变化,包括令人期待已久的泛型 的引入、新的 Using 语句、新的 IsNot关键字,以及运算符重载。“编辑并继续”调试现在已经支持 Visual Basic .NET 项目,该功能是很多以前的 Visual Basic 6 编程人员所期待的。

Visual Basic 代码编辑器包括了其他一些功能,例如符号重命名,它可以智能地重命名一个标识符(例如一个变量)的所有匹配项。代码段也是 Visual Studio 2005 中的新功能,它是用于常见任务的代码块,您可以从上下文菜单中将其插入到代码编辑器中。Visual Studio 2005 包括了很多用于常见任务的预定义代码段,您也可以定义自己的代码段。

Visual Basic 2005 的一个独特的新功能是 My命名空间,它用作常见任务的包装或“快速拨号”。这些常见任务之一就是显示窗体的默认实例。您可以直接调用 My.Form.Form1.Show,而不是显式地创建一个新的 Form1变量,然后将其实例化。My.Form集合公开项目中每个窗体类的默认实例。您甚至可以省略 My.Form前缀而简单地调用 Form1.Show,这为您提供与 Visual Basic 6 相同的语法,虽然两者的基础实现完全不同。

IDE 增强功能

每个 Visual Studio 的后续版本均引入一些新的 IDE 功能以帮助您提高工作效率。Visual Studio 2005 中的一些新 IDE 功能包括异常帮助器、用于 HTML 和 XML 的新的调试器数据可视化、窗口停靠参考线以及语法错误帮助。

异常帮助器是一个新功能,它可以让您在调试时更好地访问异常细节,并提供故障诊断提示来帮助您改正代码以避免重大异常。还有在运行时查看字符串变量中 HTML 和 XML 数据的新的可视化工具。在调试模式下,当您对字符串变量感到困惑时,您可以选择将字符串显示为 XML 或 HTML 进行查看。当您选择这些视图之一时,数据将适当地呈现在一个弹出窗口中。

如果您在试图重新定位 Visual Studio IDE 中的窗口时有过失败的经历,那么您肯定喜欢新的停靠参考线,它可以非常容易地让窗口准确地停靠在您希望的位置。

Visual Studio IDE 一直提供对代码的设计时语法检查,Visual Studio 2005 增强了这种设计时体验,它加入新的语法错误帮助,不但标识其中的语法错误,而且还基于代码所显示的想要完成的工作提供改正错误的建议。

这些新的 IDE 功能将在第 3 章“Visual Studio 2005 集成开发环境”中进一步介绍。

新的 Visual Web Developer

Visual Studio 2005 包括一个完全重新改造过的 Web 开发工具 Visual Web Developer。虽然一些对 Visual Studio .NET 2003 的改进不会立刻生效,但很多改进将很快变得显而易见。一个值得注意的变化是,当您在 Web 页的设计视图和标记视图之间切换时,设计器不会重新设置标记的格式。

Visual Studio 2005 中新的 Visual Web Developer 包括一个新的轻量级 Web 服务器,当运行 Web 应用程序时,该服务器可以在任意端口(只针对本地主机)侦听请求。图 1-11 显示一个由内置 Web 服务器提供的 Web 页。Visual Web Developer Web Server 只用于开发目的。它允许开发人员创建和测试 ASP.NET Web 应用程序,而无需 IIS(Internet 信息服务)。它还使 Web 开发人员能够更方便地工作而无需提高其权限(例如,以域用户而不是本地管理员的身份运行),因为不需要管理 IIS 或者调试其他用户进程的权限。


1-11 在端口 22289 上运行的 Visual Web Developer Web Server

ClickOnce 部署

过去部署 Windows 应用程序的种种困难使得很多组织倾向于 Web 应用程序,以便简化部署。这使得网络边缘的计算资源不能得到充分利用,并将应用程序限制于非常有限的用户界面。虽然 .NET Framework 1.1 解决了一些部署的问题(如 DLL 版本控制冲突),并使称作“No-Touch”部署的基于 Web 的部署策略成为可能,但是它仍然存在改进的空间。.NET Framework 2.0 中新的 ClickOnce 部署功能使得可以方便地部署自更新的 Windows 或控制台应用程序,这些应用程序不需要管理员权限来进行安装,并且可以在脱机模式下运行。

有关 ClickOnce 部署工作方式的详细信息,请参阅第 8 章“部署应用程序”。

小结

Microsoft .NET Framework 提供一个运行多种类型应用程序的托管环境。.NET Framework 是一个用于 Windows 应用程序、Web 应用程序、控制台应用程序和智能设备应用程序的平台。.NET Framework 提供的服务包括对象生存期管理(也称为垃圾回收)、安全性、类型安全以及与 COM 的互操作性。.NET Framework 还提供丰富的类库,您可以使用这个类库来减少需要编写(因而需要测试和维护)的代码量。这样可以获得更高的工作效率和更安全的代码,因为该类库已经在世界范围内经过了各种计算机的现场测试。

.NET Framework 也引发了开发人员构建软件方式的根本性转变。公共语言运行库提供的服务和 Framework 类库中提供的功能可以负责许多基础结构和实用工具类型的编程工作,这些编程工作可能非常费时。通过面向 .NET Framework,开发人员能够将更多的时间花在解决特定于领域的问题上,而不是解决诸如如何在客户端应用程序和服务器(Web 服务)之间传递消息这样的一般问题。

本书的其余部分介绍 Visual Studio 2005、面向 .NET Framework 的首要开发工具的最新版本。您将看到 2.0 版中对 .NET Framework 的许多改进,以及帮助您成为更高效开发人员的 Visual Studio 2005 新功能。


<script language="javascript" type="text/javascript"> var framesValid = false; if (window.name == "MNPMainFrame") { var menuFrame = parent.frames["MNPMenuFrame"]; if (menuFrame) { framesValid = true; } } if (!framesValid) location.replace("/china/msdn/library/langtool/vbnet/VisualBasic2005chapter1.mspx?mfr=true"); else document.write('
'); top.document.title = self.document.title; </script>
id="footerId" style="HEIGHT: 260px" name="footerId" marginwidth="0" marginheight="0" src="/library/gallery/components/ratingControl/ratings.aspx?rurl=http%3a%2f%2fwww.microsoft.com%2fchina%2fmsdn%2flibrary%2flangtool%2fvbnet%2fVisualBasic2005chapter1.mspx&l=zh-chs&f=True&d=LTR&t=%e7%ac%ac+1+%e7%ab%a0+%e9%9d%a2%e5%90%91+Visual+Basic%e5%bc%80%e5%8f%91%e4%ba%ba%e5%91%98%e7%9a%84+Microsoft+.NET+Framework+%e5%85%a5%e9%97%a8%e6%8c%87%e5%8d%97" frameborder="0" width="100%" scrolling="no">

©2006 Microsoft Corporation. 版权所有.   保留所有权利 | 商标 | 隐私权声明
Microsoft
<script language="javascript" type="text/javascript"> var msviFooter2; if (document.getElementById) { msviFooter2 = document.getElementById("msviFooter2"); msviFooter2.style.filter = ""; } </script>
 
<script type="text/javascript">var gDomain="m.webtrends.com";var gDcsId="dcsjwb9vb00000c932fd0rjc7_5p3t";var gFpc="WT_FPC";if(document.cookie.indexOf(gFpc+"=")==-1){document.write(" ");}</script> <script src="http://js.microsoft.com/library/mnp/2/wt/js/wt.js" type="text/javascript"></script>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值