.NET框架类览胜(上篇)
(松下客 2001年05月29日 16:46)
一、基本概念
.NET框架(Framework)是一个开发、部署和运行.NET应用的环境,包括了ASP.NET、公共语言运行时环境(CLR)以及.NET 框架类。关于ASP.NET和CLR的介绍已经有很多,相对而言,关于.NET框架类的介绍却比较少见。
.NET框架类也即System类,它提供了大量我们在构造ASP.NET应用(以及非ASP.NET应用时)可以利用的核心功能。System类可在所有.NET语言中使用,所以我们可以把System类看成是一种.NET的Windows API。与Windows API不同的是,System类提供了类似于COM的高级接口,相当容易使用。
正如所有其他.NET类,System类也以程序集(Assembly)的形式存在。.NET中的程序集类似于COM DLL或者EXE文件——它是保存类代码的执行文件。例如,Math类(包括其属性和方法定义)位于mscorlib.dll程序集。.NET有两种类型的程序集——私有程序集,共享程序集。私有程序集是属于单个应用的程序集,通常位于应用的bin目录;与此相反,共享程序集可以用于多个应用,而且它应该由程序集的创建者装入到全局程序集缓冲区(相当于.NET中的系统注册表)。.NET System类都属于共享程序集。
如果你曾经用Windows API编程,你肯定知道使用Windows API的困难在于:我们很难识别和找出要调用的是哪一个函数。在Windows API DLL之内不存在对函数进行组织的方法,看起来就像所有的API调用都被随意堆砌到了一个庞大的DLL之中。幸运的是,.NET类按照逻辑关系组织成了称为名称空间(Namespace)的层次结构。例如,Math类是System名称空间的一个成员。名称空间在层次结构中可以嵌套多层。例如,ADOConnection类是System.Data.ADO类的一个成员。
1.1 引用名称空间中的成员
要使用名称空间中的类,我们必须顺着名称空间的层次结构找到具体要使用的类,即通过“.”分隔的名字显式地引用类。例如,要创建一个ADOConnection对象,我们必须使用类似下面的代码(本文的所有例子都用Visual Basic编写,但不管是哪一种.NET语言,基本概念仍旧是一样的):
Dim cnx As System.Data.SQL.SQLConnection
cnx = New System.Data.SQL.SQLConnection( _
"server=(local);uid=sa;pwd=;database=pubs")
除了上面的方法,我们还可以用Import指令简化对类的引用。例如,下面的代码告诉ASP.NET把System.Data.SQL名称空间导入到当前页面:
<%@ Import Namespace="System.Data.SQL" %>
导入名称空间之后,我们就可以直接引用类的名字,省略所有类名字前面的名称空间说明。现在创建ADOConnection对象的代码为:
Dim cnx As SQLConnection
cnx = New SQLConnection("server=(local);uid=sa;pwd=;database=pubs")
可见,使用Import指令可以减少大量的输入。
许多名称空间已经由ASP.NET自动导入,我们不必再为了简化名称引用而去导入这些名称空间。这些名称空间如下:
System
System.Collections
System.Text
System.Text.RegularExpressions
System.Web
System.Web.Caching
System.Web.SessionState
System.Web.Security
System.Web.UI
System.Web.UI.WebControls
System.Web.UI.HTMLControls
应该注意的是,导入一个层次较高的名称空间并不意味着同时导入了层次结构中位于它下面的名称空间。也就是说,下面的Import指令只导入System.Data名称空间中的类,但没有从System.Data.ADO、System.Data.SQL以及其他System.Data下面的名称空间导入类:
<%@ Import Namespace="System.Data" %>
1.2 类的成员
类包含各种成员——属性(Property),方法(Method),域(Field),事件(Event),以及构造类的构造器(Constructor)。属性描述了类的特征,比如System.Array类有一个Length属性。方法是类能够执行的动作,例如我们可以调用Array类的Sort方法排序数组。域类似于属性,对于任何具体的应用,我们可以象对待属性一样对待域,例如Math类的PI属性返回π的值。事件代表着我们可以对它作出反应的动作,例如ADOConnection类有一个名为InfoMessage的事件,这个事件在数据库提供者发送警告或者提示性信息的时候触发。最后,构造器是一种特殊的方法,它在创建新对象的时候被调用。例如,当我们创建新的SQLConnection对象时,我们就调用该类的构造函数并把一个数据库连接串传递给它。
类的成员可以是以下两种类型之一:静态成员,实例成员。静态成员(也称为共享成员)是所有类的实例共享的成员,不依赖于类的具体实例。要使用静态成员,我们只需象使用对象一样通过类的名字引用成员的名字即可。例如,System.Math类的Pow方法是一个静态成员,用来计算数值的乘方。下面的代码计算5的3次方:
answer = Math.Pow(5, 3)
与静态成员相反,实例成员依赖于具体的实例对象。它意味着,在使用类的实例成员之前,我们必须先创建对象实例。例如,我们可以用System.Random类的实例成员NextDouble方法返回一个随机数字。下面的代码先创建一个System.Random类型的对象,然后把dblRandom变量的值设置为一个随机数字:
Dim dblRandom As Double
Dim rnd As Random = New Random
dblRandom = rnd.NextDouble
1.3 VB.NET函数与System类的成员
VB.NET语言的历史是一个不断变化的漫长过程。虽然Microsoft在VB.NET中取消了许多原来VB的功能,但VB.NET语言中的许多功能仍旧与System类的功能重复。如果可以选择的话,使用System类几乎总是比使用VB.NET功能更好。使用System类不仅使得代码更容易移植到其他语言,而且使得代码更符合未来VB.NET版本的要求,因为在未来的VB.NET语言中,Microsoft可能继续取消某些早期VB语言的功能。
二、数学计算
System.Math类包含大量可用于数学计算的域和方法,它的所有成员都是静态的。System.Math类的Pow方法能够计算数值的乘方。例如,我们可以用Math.PI域和Pow方法计算圆的面积(下例中dblRadius是圆的半径),Math.PI返回圆周率π:
dblArea = Math.PI * Math.Pow(dblRadius, 2)
用Sqrt方法可以计算数值的平方根。例如,下面的代码计算64的平方根:
answer = Math.Sqrt(64)
用Abs方法可以返回数值的绝对值。例如,下面的代码返回