.NET框架类览胜( Ccident Net )
2024-07-10 12:58:23
供稿:网友
.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方法可以返回数值的绝对值。例如,下面的代码返回-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框架类览胜(下篇)
(松下客 2001年05月29日 17:07)
一、处理字符串
.net 框架类(或system类)提供了大量可在构造.net应用时使用的核心功能,这些功能适用于任何语言环境。本文的第一部分介绍了程序集、名称空间等基本概念以及system.math和system.random类。这是本文的第二部分,接着讨论其他几个很有用的类:system.string,system.array,system.datetime。
值得指出的是,正如本文前面所提到的,当我们用vb.net作为编程语言时,我们常常面临这样一种选择:是使用vb.net语言内建的功能,还是使用等价的system类功能。在处理数组、日期/时间、字符串数据时,我们就面临这种选择。如果你曾经是一个vb 6.0程序员,你的第一个选择可能会是经过检验的、确实有效的老方法。但是,如果有可能,你最好还是改掉老习惯、采用新的.net system类。为什么呢?因为采用system类能够使你的代码更容易移植到其他.net语言以及未来的vb.net版本。
system.string类提供了丰富的字符串处理能力。使用system.string类,我们可以:确定字符串的长度,查找子串,改变字符串的大小写,比较两个字符串,分割字符串,等等。
确定字符串长度使用的是length属性。例如,在下面的代码中,intlength的值将是4:
dim strcolor as string = "blue"
dim intlength as integer
intlength = strcolor.length
我们用indexof方法从字符串找出第一个匹配的子串。如果能够找到子串,indexof方法返回子串的开始位置(第一个字符的开始位置为0);如果不能找到,则indexof返回-1。indexof的查找是大小写敏感的。indexof是一个被重载(overload)的方法,它允许传入的参数包括:char类型的字符,string类型的字符串,char类型的字符数组。下面这个indexof.aspx页面示范了三种不同参数类型indexof方法的运用:
<%@ page language="vb" explicit="true"%>
<head>
<title>system.string实例</title>
<script language="vb" runat="server">
sub page_load(src as object, e as eventargs)
dim chrg as char = "g"
dim strword as string = "for"
dim chrvowels as char() = {"a","e","i","o","u"}
dim strphrase as string = _
"one small step for man, one giant leap for mankind."
dim i as integer
lbloutput.text &= "<br />strphrase = " & strphrase
lbloutput.text &= "<br />position of chrg = " _
& strphrase.indexof(chrg)
lbloutput.text &= "<br />position of strword = " _
& strphrase.indexof(strword)
lbloutput.text &= "<br />position of chrvowels = " _
& strphrase.indexof(chrvowels)
end sub
</script>
</head>
<body>
<asp:label id="lbloutput" runat="server" />
</body>
</html>
这个页面的运行结果如下:
indexof允许指定两个用来限制搜索的可选参数,它们分别代表搜索字符串的起始和结束位置。例如,下面的代码对chrvowels的搜索限制在第10到20个字符之间:
strphrase.indexof(chrvowels, 10, 20)
lastindexof方法类似于indexof方法,但它搜索的是子串的最后一次出现。例如,如果你修改indexof.aspx页面,用lastindexof方法来取代indexof方法,则strword的位置将是39而不是15。
使用system.string的toupper和tolower方法可以把字符串分别改成全部大写或者全部小写。例如:
strupper = "this is a mixed case sentence".toupper()
strlower = "this is a mixed case sentence".tolower()
从这个例子可以看出,system.string的属性和方法既可以在字符串变量中应用,也可以直接在字符串文本中应用。
你可以用compare方法比较两个字符串是否相同。如果两个字符串相同,compare方法返回0;如果第一个字符串小于第二个字符串,compare返回一个负数;如果第一个字符串大于第二个字符串,compare方法返回一个正数。compare是一个静态方法(参见本文前面关于静态方法和实例方法的说明)。默认情况下,compare对字符串的比较是大小写敏感的,且不考虑地区关系。例如,下面对str1和str2的比较将返回-1,它表示str1小于str2:
dim str1 as string = "abcd.com"
dim str2 as string = "abcd.com"
answer = string.compare(str1, str2)
我们可以向compare传入第三个可选的参数。如果第三个参数指定为true,则字符串比较操作忽略大小写,比如下面的代码中answer的值将是0,即两个字符串相等。
answer = string.compare(str1, str2, true)
正如indexof方法,compare也是一个被重载的方法。我们可以向compare方法传入第四个参数要求进行地区相关的比较;或者,我们也可以指定字符的起始和结束位置使得比较只对字符串的一部分进行。请参见.net framework sdk文档了解详细信息。split方法把字符串分割成一个由子串构成的数组。使用split方法时,我们必须指定用来分割字符串的、char类型的分割字符。下面的split.aspx页面示范了split方法的应用:
<%@ page language="vb" explicit="true"%>
<head>
<title>split实例</title>
<script language="vb" runat="server">
sub page_load(src as object, e as eventargs)
dim strasp as string = _
"asp.net is the next generation of active server pages."
dim strwords() as string
dim i as integer
strwords = strasp.split(" ")
for i = strwords.getlowerbound(0) to strwords.getupperbound(0)
lbloutput.text &= i & ": " & strwords(i) & "<br />"
next
end sub
</script>
</head>
<body>
<asp:label id="lbloutput" runat="server" />
</body>
</html>
split.aspx的输出结果如下:
前面我们讨论了string类部分属性和方法的应用。string还包括许多其他成员,比如:从数组构造出字符串,把字符串中的一个字符替换成其他字符,删除字符串前面或者后面的空白字符,等等。
二、操作数组
我们可以通过system.array类用各种方法处理数组。与前面的几个类一样,system.string类的许多功能重复了vb语言所具有的功能。但array类也增加了一些传统vb语言不具备的功能,比如搜索和排序数组。
array类的getlowerbound和getupperbound方法用于确定数组指定维的下界和上界。下面这个语句来自split.aspx(参见前面的例子),它通过getlowerbound和getupperbound方法确定strwords数组的边界:
for i = strwords.getlowerbound(0) to strwords.getupperbound(0)
system.array的sort静态方法能够对一维数组的内容排序。sort方法对数组的排序是大小写敏感的,而且它不能对一维以上的数组排序。调用sort方法的语法下:
array.sort(array_name)
对于一维数组,我们还可以用reverse方法颠倒数组元素的次序。reverse方法的语法类似于sort方法:
array.reverse(array_name)
下面的代码(来自arraysort.aspx示例页面)示范了sort和reverse方法的应用:
dim strterms() as string = {"jscript", "vb", "asp", "asp.net", ".net"}
dim i as integer
lbloutput.text &= "original array<br />"
for i = strterms.getlowerbound(0) to strterms.getupperbound(0)
lbloutput.text &= i & ": " & strterms(i) & "<br />"
next
array.sort(strterms)
lbloutput.text &= "<br />after sorting<br />"
for i = strterms.getlowerbound(0) to strterms.getupperbound(0)
lbloutput.text &= i & ": " & strterms(i) & "<br />"
next
array.reverse(strterms)
lbloutput.text &= "<br />after reversing<br />"
for i = strterms.getlowerbound(0) to strterms.getupperbound(0)
lbloutput.text &= i & ": " & strterms(i) & "<br />"
next
arraysort.aspx页面的输出结果如下:
system.array方法支持用indexof和lastindexof方法对一维数组进行搜索,这两个方法与system.string类的同名方法类似。用indexof和lastindexof方法搜索数组的语法如下:
answer = array.indexof(array_name, search_string)
answer = array.lastindexof(array_name, search_string)
这两个方法分别返回搜索字符串第一次和最后一次匹配的位置;如果不能找到,则返回值是-1。这种搜索是大小写敏感的。例如,在下面的代码中,answer将是2,它表示字符串“asp”是strterms数组的第三个元素。
dim strterms() as string = {"jscript", "vb", "asp", "asp.net", ".net"}
answer = array.indexof(strterms, "asp")
三、处理日期/时间数据
system.datetime类提供了许多处理datetime值的方法。要创建一个datetime值,我们只需声明一个datetime类型的变量,并通过“#”分隔符赋予它一个datetime常量,如下所示:
dim seattlequake as datetime = #02/28/01 10:54#
system.datetime类一个很大的优点是:我们能够通过它的属性非常方便地分析日期/时间值。这些datetime类属性的含义非常明显,它们是:year,month,day,dayofweek,dayofyear,hour,minute,second,millisecond,ticks,等。每个ticks等于100个纳秒(毫微秒)。例如,在下面的代码中,answer的值将等于10:
answer = seattlequake.hour
我们还可以用date和timeofday属性获得datetime数据的日期或者时间部分。timeofday属性返回的是一个timespan值,它表示已流逝的按ticks计的时间。可以想象,利用timespan值的属性我们可以分析出timespan时间的各个部分。请参见.net framework sdk文档了解详细信息。
system.datetime类还提供了几个增加(或者减少)datetime值某一部分的方法,它们是:addyears,addmonths,adddays,addhours,addminutes,addseconds,addmilliseconds,addticks。
例如,下面的代码对指定的日期(bday)进行加1年、减1年操作:
dim bday as datetime = #6/25/2001 12:00#
dim nextbday as datetime
dim lastbday as datetime
nextbday = thedate.addyears(1)
lastbday = thedate.addyears(-1)
【参考】
介绍com的历史、.net框架,以及两者之间的关系:http://www.microsoft.com/net/developer/framework_com.asp。
net framework developer resources :http://msdn.microsoft.com/net/framework/default.asp。