一、基本概念
.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方法可以返回数值的绝对值。例如,下面的代码返回-7.8的绝对值,answer的值将是7.8:
answer = Math.Abs(-7.8)
Sign方法可以返回数值的符号。如果数值是负数,Sign返回-1;如果是正数,Sign返回1;如果是0,Sign返回0。Round方法把数值舍入成为最接近的整数。例如,下面的代码舍入3.4677789这个值,answer的值将是3:
answer = Math.Round(3.4677789)
如果你想要Round一个恰好处于两个整数值之间的值,比如3.5,则Round总是返回最接近该数值的偶数。也就是说,Math.Round(3.5)返回值是4,而Math.Round(6.5)的返回值是6。Floor方法用来截短一个实数,它的返回值是小于指定数值的最大整数值。例如,下面的代码截短数值5.9,answer的值将是5:
answer = Math.Floor(5.9)
注意Floor方法操作负数的结果可能与你所想象的不同。例如,Floor(-5.9)的返回值应该是-6。
除了上面介绍的这些方法之外,Math类还包含许多进行三角计算和对数计算的方法。
三、生成随机数字
System.Random类用来生成随机数字。然而,与VB的Rnd函数不同,System.Random既能够返回小数随机数,也能够返回整数随机数;System.Random类根据系统日期和时间自动生成随机数种子初始化随机数生成器。
用System.Random的NextDouble方法可以返回一个0到1之间的Double类型随机数;用Next方法可以返回两个整数值之间的随机整数。NextDouble和Next都是实例方法,所以在使用这些方法之前你必须先创建一个System.Random类型的对象。下面是一个完整的ASP.NET页面,它显示了如何运用这些方法生成20个随机数字,其中10个随机数字处于0到1之间,另外10个处于1到50之间:
<%@ Page Language="vb" Explicit="True"%>
<head>
<title>Random实例</title>
<script language="VB" runat="server">
Sub Page_Load(Src as Object, E as EventArgs)
' 等价于VB6 Rnd函数的.NET框架类
' 随机数生成方法
Dim rnd As System.Random = New System.Random
Dim i As Integer
lblOutput.Text &= "<table border=""1"">"
lblOutput.Text &= "<tr><th>rnd.NextDouble</th>" & _
<th>Next(1,50)</th></tr>"
For i = 1 To 10
lblOutput.Text &= "<tr>"
lblOutput.Text &= "<td>" & rnd.NextDouble & "</td>"
lblOutput.Text &= "<td>" & rnd.Next(1,50) & "</td>"
lblOutput.Text &= "</tr>"
Next
lblOutput.Text &= "</table>"
End Sub
</script>
</head>
<body>
<asp:label id="lblOutput" runat="server" />
</body>
</html>
下图显示了这个页面的运行结果(当然,如果你运行这个页面,得到的很可能是一组不同的随机数字)。
前面我们讨论了.NET Framework中程序集、名称空间和类如何结合成一个整体,以及如何利用内建的System类进行数学计算和生成随机数字。本文的第二部分将接着讨论其他几个有用的类,包括Array类、String类、DateTime类等。
.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方法可以返回数值的绝对值。例如,下面的代码返回-7.8的绝对值,answer的值将是7.8:
answer = Math.Abs(-7.8)
Sign方法可以返回数值的符号。如果数值是负数,Sign返回-1;如果是正数,Sign返回1;如果是0,Sign返回0。Round方法把数值舍入成为最接近的整数。例如,下面的代码舍入3.4677789这个值,answer的值将是3:
answer = Math.Round(3.4677789)
如果你想要Round一个恰好处于两个整数值之间的值,比如3.5,则Round总是返回最接近该数值的偶数。也就是说,Math.Round(3.5)返回值是4,而Math.Round(6.5)的返回值是6。Floor方法用来截短一个实数,它的返回值是小于指定数值的最大整数值。例如,下面的代码截短数值5.9,answer的值将是5:
answer = Math.Floor(5.9)
注意Floor方法操作负数的结果可能与你所想象的不同。例如,Floor(-5.9)的返回值应该是-6。
除了上面介绍的这些方法之外,Math类还包含许多进行三角计算和对数计算的方法。
三、生成随机数字
System.Random类用来生成随机数字。然而,与VB的Rnd函数不同,System.Random既能够返回小数随机数,也能够返回整数随机数;System.Random类根据系统日期和时间自动生成随机数种子初始化随机数生成器。
用System.Random的NextDouble方法可以返回一个0到1之间的Double类型随机数;用Next方法可以返回两个整数值之间的随机整数。NextDouble和Next都是实例方法,所以在使用这些方法之前你必须先创建一个System.Random类型的对象。下面是一个完整的ASP.NET页面,它显示了如何运用这些方法生成20个随机数字,其中10个随机数字处于0到1之间,另外10个处于1到50之间:
<%@ Page Language="vb" Explicit="True"%>
<head>
<title>Random实例</title>
<script language="VB" runat="server">
Sub Page_Load(Src as Object, E as EventArgs)
' 等价于VB6 Rnd函数的.NET框架类
' 随机数生成方法
Dim rnd As System.Random = New System.Random
Dim i As Integer
lblOutput.Text &= "<table border=""1"">"
lblOutput.Text &= "<tr><th>rnd.NextDouble</th>" & _
<th>Next(1,50)</th></tr>"
For i = 1 To 10
lblOutput.Text &= "<tr>"
lblOutput.Text &= "<td>" & rnd.NextDouble & "</td>"
lblOutput.Text &= "<td>" & rnd.Next(1,50) & "</td>"
lblOutput.Text &= "</tr>"
Next
lblOutput.Text &= "</table>"
End Sub
</script>
</head>
<body>
<asp:label id="lblOutput" runat="server" />
</body>
</html>
下图显示了这个页面的运行结果(当然,如果你运行这个页面,得到的很可能是一组不同的随机数字)。
前面我们讨论了.NET Framework中程序集、名称空间和类如何结合成一个整体,以及如何利用内建的System类进行数学计算和生成随机数字。本文的第二部分将接着讨论其他几个有用的类,包括Array类、String类、DateTime类等。