一基本概念
NET框架(Framework)是一个开发部署和运行NET应用的环境包括了ASPNET公共语言运行时环境(CLR)以及NET 框架类关于ASPNET和CLR的介绍已经有很多相对而言关于NET框架类的介绍却比较少见
NET框架类也即System类它提供了大量我们在构造ASPNET应用(以及非ASPNET应用时)可以利用的核心功能System类可在所有NET语言中使用所以我们可以把System类看成是一种NET的Windows API与Windows API不同的是System类提供了类似于COM的高级接口相当容易使用
正如所有其他NET类System类也以程序集(Assembly)的形式存在NET中的程序集类似于COM DLL或者EXE文件——它是保存类代码的执行文件例如Math类(包括其属性和方法定义)位于mscorlibdll程序集NET有两种类型的程序集——私有程序集共享程序集私有程序集是属于单个应用的程序集通常位于应用的bin目录与此相反共享程序集可以用于多个应用而且它应该由程序集的创建者装入到全局程序集缓沖区(相当于NET中的系统注册表)NET System类都属于共享程序集
如果你曾经用Windows API编程你肯定知道使用Windows API的困难在于我们很难识别和找出要调用的是哪一个函数在Windows API DLL之内不存在对函数进行组织的方法看起来就像所有的API调用都被随意堆砌到了一个庞大的DLL之中幸运的是NET类按照逻辑关系组织成了称为名称空间(Namespace)的层次结构例如Math类是System名称空间的一个成员名称空间在层次结构中可以嵌套多层例如ADOConnection类是SystemDataADO类的一个成员
引用名称空间中的成员
要使用名称空间中的类我们必须顺着名称空间的层次结构找到具体要使用的类即通过分隔的名字显式地引用类例如要创建一个ADOConnection对象我们必须使用类似下面的代码(本文的所有例子都用Visual Basic编写但不管是哪一种NET语言基本概念仍旧是一样的)
Dim cnx As SystemDataSQLSQLConnection
cnx = New SystemDataSQLSQLConnection( _
server=(local);uid=sa;pwd=;database=pubs)
除了上面的方法我们还可以用Import指令简化对类的引用例如下面的代码告诉ASPNET把SystemDataSQL名称空间导入到当前页面
<%@ Import Namespace=SystemDataSQL %>
导入名称空间之后我们就可以直接引用类的名字省略所有类名字前面的名称空间说明现在创建ADOConnection对象的代码为
Dim cnx As SQLConnection
cnx = New SQLConnection(server=(local);uid=sa;pwd=;database=pubs)
可见使用Import指令可以减少大量的输入
许多名称空间已经由ASPNET自动导入我们不必再为了简化名称引用而去导入这些名称空间这些名称空间如下
System
SystemCollections
SystemText
SystemTextRegularExpressions
SystemWeb
SystemWebCaching
SystemWebSessionState
SystemWebSecurity
SystemWebUI
SystemWebUIWebControls
SystemWebUIHtmlControls
应该注意的是导入一个层次较高的名称空间并不意味着同时导入了层次结构中位于它下面的名称空间也就是说下面的Import指令只导入SystemData名称空间中的类但没有从SystemDataADOSystemDataSQL以及其他SystemData下面的名称空间导入类
<%@ Import Namespace=SystemData %>
类的成员
类包含各种成员——属性(Property)方法(Method)域(Field)事件(Event)以及构造类的构造器(Constructor)属性描述了类的特征比如SystemArray类有一个Length属性方法是类能够执行的动作例如我们可以调用Array类的Sort方法排序数组域类似于属性对于任何具体的应用我们可以象对待属性一样对待域例如Math类的PI属性返回π的值事件代表着我们可以对它作出反应的动作例如ADOConnection类有一个名为InfoMessage的事件这个事件在数据库提供者发送警告或者提示性信息的时候触发最后构造器是一种特殊的方法它在创建新对象的时候被调用例如当我们创建新的SQLConnection对象时我们就调用该类的构造函数并把一个数据库连接串传递给它
三处理日期/时间数据
SystemDateTime类提供了许多处理DateTime值的方法要创建一个DateTime值我们只需声明一个DateTime类型的变量并通过#分隔符赋予它一个DateTime常量如下所示
Dim SeattleQuake As DateTime = #// :#
SystemDateTime类一个很大的优点是我们能够通过它的属性非常方便地分析日期/时间值这些DateTime类属性的含义非常明显它们是YearMonthDayDayOfWeekDayOfYearHourMinuteSecondMillisecondTicks等每个Ticks等于个纳秒(毫微秒)例如在下面的代码中answer的值将等于
answer = SeattleQuakeHour
我们还可以用Date和TimeOfDay属性获得DateTime数据的日期或者时间部分TimeOfDay属性返回的是一个TimeSpan值它表示已流逝的按ticks计的时间可以想象利用TimeSpan值的属性我们可以分析出TimeSpan时间的各个部分请参见NET Framework SDK文档了解详细信息
SystemDateTime类还提供了几个增加(或者减少)DateTime值某一部分的方法它们是AddYearsAddMonthsAddDaysAddHoursAddMinutesAddSecondsAddMillisecondsAddTicks
例如下面的代码对指定的日期(BDay)进行加年减年操作
Dim BDay As DateTime = #// :#
Dim NextBDay As DateTime
Dim LastBDay As DateTime
NextBDay = TheDateAddYears()
LastBDay = TheDateAddYears()
类的成员可以是以下两种类型之一静态成员实例成员静态成员(也称为共享成员)是所有类的实例共享的成员不依赖于类的具体实例要使用静态成员我们只需象使用对象一样通过类的名字引用成员的名字即可例如SystemMath类的Pow方法是一个静态成员用来计算数值的乘方下面的代码计算的次方
answer = MathPow( )
与静态成员相反实例成员依赖于具体的实例对象它意味着在使用类的实例成员之前我们必须先创建对象实例例如我们可以用SystemRandom类的实例成员NextDouble方法返回一个随机数字下面的代码先创建一个SystemRandom类型的对象然后把dblRandom变量的值设置为一个随机数字
Dim dblRandom As Double
Dim rnd As Random = New Random
dblRandom = rndNextDouble
VBNET函数与System类的成员
VBNET语言的历史是一个不断变化的漫长过程虽然Microsoft在VBNET中取消了许多原来VB的功能但VBNET语言中的许多功能仍旧与System类的功能重复如果可以选择的话使用System类几乎总是比使用VBNET功能更好使用System类不仅使得代码更容易移植到其他语言而且使得代码更符合未来VBNET版本的要求因为在未来的VBNET语言中Microsoft可能继续取消某些早期VB语言的功能
二数学计算
SystemMath类包含大量可用于数学计算的域和方法它的所有成员都是静态的SystemMath类的Pow方法能够计算数值的乘方例如我们可以用MathPI域和Pow方法计算圆的面积(下例中dblRadius是圆的半径)MathPI返回圆周率π
dblArea = MathPI * MathPow(dblRadius )
用Sqrt方法可以计算数值的平方根例如下面的代码计算的平方根
answer = MathSqrt()
用Abs方法可以返回数值的绝对值例如下面的代码返回的绝对值answer的值将是
answer = MathAbs()
Sign方法可以返回数值的符号如果数值是负数Sign返回如果是正数Sign返回如果是Sign返回Round方法把数值捨入成为最接近的整数例如下面的代码捨入这个值answer的值将是
answer = MathRound()
如果你想要Round一个恰好处于两个整数值之间的值比如则Round总是返回最接近该数值的偶数也就是说MathRound()返回值是而MathRound()的返回值是Floor方法用来截短一个实数它的返回值是小于指定数值的最大整数值例如下面的代码截短数值answer的值将是
answer = MathFloor()
注意Floor方法操作负数的结果可能与你所想象的不同例如Floor()的返回值应该是
除了上面介绍的这些方法之外Math类还包含许多进行三角计算和对数计算的方法
三生成随机数字
SystemRandom类用来生成随机数字然而与VB的Rnd函数不同SystemRandom既能够返回小数随机数也能够返回整数随机数SystemRandom类根据系统日期和时间自动生成随机数种子初始化随机数生成器
用SystemRandom的NextDouble方法可以返回一个到之间的Double类型随机数用Next方法可以返回两个整数值之间的随机整数NextDouble和Next都是实例方法所以在使用这些方法之前你必须先创建一个SystemRandom类型的对象下面是一个完整的ASPNET页面它显示了如何运用这些方法生成个随机数字其中个随机数字处于到之间另外个处于到之间
<%@ Page Language=vb Explicit=True%>
<head>
<title>Random实例</title>
<script language=VB runat=server>
Sub Page_Load(Src as Object E as EventArgs)
等价于VB Rnd函数的NET框架类
随机数生成方法
Dim rnd As SystemRandom = New SystemRandom
Dim i As Integer
lblOutputText &= <table border=>
lblOutputText &= <tr><th>rndNextDouble</th> & _
<th>Next()</th></tr>
For i = To
lblOutputText &= <tr>
lblOutputText &= <td> & rndNextDouble & </td>
lblOutputText &= <td> & rndNext() & </td>
lblOutputText &= </tr>
Next
lblOutputText &= </table>
End Sub
</script>
</head>
<body>
<asp:label id=lblOutput runat=server />
</body>
</html>
下图显示了这个页面的运行结果(当然如果你运行这个页面得到的很可能是一组不同的随机数字)
第二部分
前面我们讨论了NET Framework中程序集名称空间和类如何结合成一个整体以及如何利用内建的System类进行数学计算和生成随机数字本文的第二部分将接着讨论其他几个有用的类包括Array类String类DateTime类等
一处理字符串
NET 框架类(或System类)提供了大量可在构造NET应用时使用的核心功能这些功能适用于任何语言环境本文的第一部分介绍了程序集名称空间等基本概念以及SystemMath和SystemRandom类
这是本文的第二部分接着讨论其他几个很有用的类SystemStringSystemArraySystemDateTime
值得指出的是正如本文前面所提到的当我们用VBNET作为编程语言时我们常常面临这样一种选择是使用VBNET语言内建的功能还是使用等价的System类功能在处理数组日期/时间字符串数据时我们就面临这种选择如果你曾经是一个VB 程序员你的第一个选择可能会是经过检验的确实有效的老方法但是如果有可能你最好还是改掉老习惯采用新的NET System类为什么呢?因为采用System类能够使你的代码更容易移植到其他NET语言以及未来的VBNET版本
SystemString类提供了丰富的字符串处理能力使用SystemString类我们可以确定字符串的长度查找子串改变字符串的大小写比较两个字符串分割字符串等等
确定字符串长度使用的是Length属性例如在下面的代码中intLength的值将是
Dim strColor As String = blue
Dim intLength As Integer
intLength = strColorlength
我们用IndexOf方法从字符串找出第一个匹配的子串如果能够找到子串IndexOf方法返回子串的开始位置(第一个字符的开始位置为)如果不能找到则IndexOf返回IndexOf的查找是大小写敏感的IndexOf是一个被重载(Overload)的方法它允许传入的参数包括Char类型的字符String类型的字符串Char类型的字符数组下面这个IndexOfaspx页面示范了三种不同参数类型IndexOf方法的运用
<%@ Page Language=vb Explicit=True%>
<head>
<title>SystemString实例</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() =
Dim strPhrase As String = _
One small step for man one giant leap for mankind
Dim i As Integer
lblOutputText &= <br />strPhrase = & strPhrase
lblOutputText &= <br />Position of chrG = _
& strPhraseIndexOf(chrG)
lblOutputText &= <br />Position of strWord = _
& strPhraseIndexOf(strWord)
lblOutputText &= <br />Position of chrVowels = _
& strPhraseIndexOf(chrVowels)
End Sub
</script>
</head>
<body>
<asp:label id=lblOutput runat=server />
</body>
</html>
这个页面的运行结果如下
IndexOf允许指定两个用来限制搜索的可选参数它们分别代表搜索字符串的起始和结束位置例如下面的代码对chrVowels的搜索限制在第到个字符之间
strPhraseIndexOf(chrVowels )
LastIndexOf方法类似于IndexOf方法但它搜索的是子串的最后一次出现例如如果你修改IndexOfaspx页面用LastIndexOf方法来取代IndexOf方法则strWord的位置将是而不是
使用SystemString的ToUpper和ToLower方法可以把字符串分别改成全部大写或者全部小写例如
strUpper = This is a mixed case sentenceToUpper()
strLower = This is a mixed case sentenceToLower()
从这个例子可以看出SystemString的属性和方法既可以在字符串变量中应用也可以直接在字符串文本中应用
你可以用Compare方法比较两个字符串是否相同如果两个字符串相同Compare方法返回如果第一个字符串小于第二个字符串Compare返回一个负数如果第一个字符串大于第二个字符串Compare方法返回一个正数Compare是一个静态方法(参见本文前面关于静态方法和实例方法的说明)默认情况下Compare对字符串的比较是大小写敏感的且不考虑地区关系例如下面对Str和Str的比较将返回它表示Str小于Str
Dim str As String =
Dim str As String = abcdCom
answer = StringCompare(str str)
我们可以向Compare传入第三个可选的参数如果第三个参数指定为True则字符串比较操作忽略大小写比如下面的代码中answer的值将是即两个字符串相等
answer = StringCompare(str str True)
正如IndexOf方法Compare也是一个被重载的方法我们可以向Compare方法传入第四个参数要求进行地区相关的比较或者我们也可以指定字符的起始和结束位置使得比较只对字符串的一部分进行请参见NET Framework SDK文档了解详细信息Split方法把字符串分割成一个由子串构成的数组使用Split方法时我们必须指定用来分割字符串的Char类型的分割字符下面的Splitaspx页面示范了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 = _
ASPNET is the next generation of Active Server Pages
Dim strWords() As String
Dim i As Integer
strWords = strASPSplit( )
For i = strWordsGetLowerBound() to strWordsGetUpperBound()
lblOutputText &= i & : & strWords(i) & <br />
Next
End Sub
</script>
</head>
<body>
<asp:label id=lblOutput runat=server />
</body>
</html>
Splitaspx的输出结果如下
前面我们讨论了String类部分属性和方法的应用String还包括许多其他成员比如从数组构造出字符串把字符串中的一个字符替换成其他字符删除字符串前面或者后面的空白字符等等
二操作数组
我们可以通过SystemArray类用各种方法处理数组与前面的几个类一样SystemString类的许多功能重复了VB语言所具有的功能但Array类也增加了一些传统VB语言不具备的功能比如搜索和排序数组
Array类的GetLowerBound和GetUpperBound方法用于确定数组指定维的下界和上界下面这个语句来自Splitaspx(参见前面的例子)它通过GetLowerBound和GetUpperBound方法确定strWords数组的边界
For i = strWordsGetLowerBound() to strWordsGetUpperBound()
SystemArray的Sort静态方法能够对一维数组的内容排序Sort方法对数组的排序是大小写敏感的而且它不能对一维以上的数组排序调用Sort方法的语法下
ArraySort(array_name)
对于一维数组我们还可以用Reverse方法颠倒数组元素的次序Reverse方法的语法类似于Sort方法
ArrayReverse(array_name)
下面的代码(来自ArraySortaspx示例页面)示范了Sort和Reverse方法的应用
Dim strTerms() As String = {JScript VB ASP ASPNET NET}
Dim i As Integer
lblOutputText &= Original Array<br />
For i = strTermsGetLowerBound() to strTermsGetUpperBound()
lblOutputText &= i & : & strTerms(i) & <br />
Next
ArraySort(strTerms)
lblOutputText &= <br />After Sorting<br />
For i = strTermsGetLowerBound() to strTermsGetUpperBound()
lblOutputText &= i & : & strTerms(i) & <br />
Next
ArrayReverse(strTerms)
lblOutputText &= <br />After Reversing<br />
For i = strTermsGetLowerBound() to strTermsGetUpperBound()
lblOutputText &= i & : & strTerms(i) & <br />
Next
ArraySortaspx页面的输出结果如下
SystemArray方法支持用IndexOf和LastIndexOf方法对一维数组进行搜索这两个方法与SystemString类的同名方法类似用IndexOf和LastIndexOf方法搜索数组的语法如下
answer = ArrayIndexOf(array_name search_string)
answer = ArrayLastIndexOf(array_name search_string)
这两个方法分别返回搜索字符串第一次和最后一次匹配的位置如果不能找到则返回值是这种搜索是大小写敏感的例如在下面的代码中answer将是它表示字符串ASP是strTerms数组的第三个元素
Dim strTerms() As String = {JScript VB ASP ASPNET NET}
answer = ArrayIndexOf(strTerms ASP)