直播中
.NET框架類也即System類,它提供了大量我們在構(gòu)造ASP.NET應用(以及非ASP.NET應用時)可以利用的核心功能。System類可在所有.NET語言中使用,所以我們可以把System類看成是一種.NET的Windows API。與Windows API不同的是,System類提供了類似于COM的高級接口,相當容易使用。
正如所有其他.NET類,System類也以程序集(Assembly)的形式存在。.NET中的程序集類似于COM DLL或者EXE文件——它是保存類代碼的執(zhí)行文件。例如,Math類(包括其屬性和方法定義)位于mscorlib.dll程序集。.NET有兩種類型的程序集——私有程序集,共享程序集。私有程序集是屬于單個應用的程序集,通常位于應用的bin目錄;與此相反,共享程序集可以用于多個應用,而且它應該由程序集的創(chuàng)建者裝入到全局程序集緩沖區(qū)(相當于.NET中的系統(tǒng)注冊表)。.NET System類都屬于共享程序集。
如果你曾經(jīng)用Windows API編程,你肯定知道使用Windows API的困難在于:我們很難識別和找出要調(diào)用的是哪一個函數(shù)。在Windows API DLL之內(nèi)不存在對函數(shù)進行組織的方法,看起來就像所有的API調(diào)用都被隨意堆砌到了一個龐大的DLL之中。幸運的是,.NET類按照邏輯關系組織成了稱為名稱空間(Namespace)的層次結(jié)構(gòu)。例如,Math類是System名稱空間的一個成員。名稱空間在層次結(jié)構(gòu)中可以嵌套多層。例如,ADOConnection類是System.Data.ADO類的一個成員。
1.1 引用名稱空間中的成員
要使用名稱空間中的類,我們必須順著名稱空間的層次結(jié)構(gòu)找到具體要使用的類,即通過“.”分隔的名字顯式地引用類。例如,要創(chuàng)建一個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" %>
導入名稱空間之后,我們就可以直接引用類的名字,省略所有類名字前面的名稱空間說明。現(xiàn)在創(chuàng)建ADOConnection對象的代碼為:
Dim cnx As SQLConnection
cnx = New SQLConnection("server=(local);uid=sa;pwd=;database=pubs")
可見,使用Import指令可以減少大量的輸入。
許多名稱空間已經(jīng)由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
應該注意的是,導入一個層次較高的名稱空間并不意味著同時導入了層次結(jié)構(gòu)中位于它下面的名稱空間。也就是說,下面的Import指令只導入System.Data名稱空間中的類,但沒有從System.Data.ADO、System.Data.SQL以及其他System.Data下面的名稱空間導入類:
<%@ Import Namespace="System.Data" %>
1.2 類的成員
類包含各種成員——屬性(Property),方法(Method),域(Field),事件(Event),以及構(gòu)造類的構(gòu)造器(Constructor)。屬性描述了類的特征,比如System.Array類有一個Length屬性。方法是類能夠執(zhí)行的動作,例如我們可以調(diào)用Array類的Sort方法排序數(shù)組。域類似于屬性,對于任何具體的應用,我們可以象對待屬性一樣對待域,例如Math類的PI屬性返回π的值。事件代表著我們可以對它作出反應的動作,例如ADOConnection類有一個名為InfoMessage的事件,這個事件在數(shù)據(jù)庫提供者發(fā)送警告或者提示性信息的時候觸發(fā)。最后,構(gòu)造器是一種特殊的方法,它在創(chuàng)建新對象的時候被調(diào)用。例如,當我們創(chuàng)建新的SQLConnection對象時,我們就調(diào)用該類的構(gòu)造函數(shù)并把一個數(shù)據(jù)庫連接串傳遞給它。
類的成員可以是以下兩種類型之一:靜態(tài)成員,實例成員。靜態(tài)成員(也稱為共享成員)是所有類的實例共享的成員,不依賴于類的具體實例。要使用靜態(tài)成員,我們只需象使用對象一樣通過類的名字引用成員的名字即可。例如,System.Math類的Pow方法是一個靜態(tài)成員,用來計算數(shù)值的乘方。下面的代碼計算5的3次方:
answer = Math.Pow(5, 3)
與靜態(tài)成員相反,實例成員依賴于具體的實例對象。它意味著,在使用類的實例成員之前,我們必須先創(chuàng)建對象實例。例如,我們可以用System.Random類的實例成員NextDouble方法返回一個隨機數(shù)字。下面的代碼先創(chuàng)建一個System.Random類型的對象,然后把dblRandom變量的值設置為一個隨機數(shù)字:
Dim dblRandom As Double
Dim rnd As Random = New Random
dblRandom = rnd.NextDouble
1.3 VB.NET函數(shù)與System類的成員
VB.NET語言的歷史是一個不斷變化的漫長過程。雖然Microsoft在VB.NET中取消了許多原來VB的功能,但VB.NET語言中的許多功能仍舊與System類的功能重復。如果可以選擇的話,使用System類幾乎總是比使用VB.NET功能更好。使用System類不僅使得代碼更容易移植到其他語言,而且使得代碼更符合未來VB.NET版本的要求,因為在未來的VB.NET語言中,Microsoft可能繼續(xù)取消某些早期VB語言的功能。
二、數(shù)學計算
System.Math類包含大量可用于數(shù)學計算的域和方法,它的所有成員都是靜態(tài)的。System.Math類的Pow方法能夠計算數(shù)值的乘方。例如,我們可以用Math.PI域和Pow方法計算圓的面積(下例中dblRadius是圓的半徑),Math.PI返回圓周率π:
dblArea = Math.PI * Math.Pow(dblRadius, 2)
用Sqrt方法可以計算數(shù)值的平方根。例如,下面的代碼計算64的平方根:
answer = Math.Sqrt(64)
用Abs方法可以返回數(shù)值的絕對值。例如,下面的代碼返回-7.8的絕對值,answer的值將是7.8:
answer = Math.Abs(-7.8)
Sign方法可以返回數(shù)值的符號。如果數(shù)值是負數(shù),Sign返回-1;如果是正數(shù),Sign返回1;如果是0,Sign返回0。Round方法把數(shù)值舍入成為最接近的整數(shù)。例如,下面的代碼舍入3.4677789這個值,answer的值將是3:
answer = Math.Round(3.4677789)
如果你想要Round一個恰好處于兩個整數(shù)值之間的值,比如3.5,則Round總是返回最接近該數(shù)值的偶數(shù)。也就是說,Math.Round(3.5)返回值是4,而Math.Round(6.5)的返回值是6。Floor方法用來截短一個實數(shù),它的返回值是小于指定數(shù)值的最大整數(shù)值。例如,下面的代碼截短數(shù)值5.9,answer的值將是5:
answer = Math.Floor(5.9)
注意Floor方法操作負數(shù)的結(jié)果可能與你所想象的不同。例如,F(xiàn)loor(-5.9)的返回值應該是-6。
除了上面介紹的這些方法之外,Math類還包含許多進行三角計算和對數(shù)計算的方法。
三、生成隨機數(shù)字
System.Random類用來生成隨機數(shù)字。然而,與VB的Rnd函數(shù)不同,System.Random既能夠返回小數(shù)隨機數(shù),也能夠返回整數(shù)隨機數(shù);System.Random類根據(jù)系統(tǒng)日期和時間自動生成隨機數(shù)種子初始化隨機數(shù)生成器。
用System.Random的NextDouble方法可以返回一個0到1之間的Double類型隨機數(shù);用Next方法可以返回兩個整數(shù)值之間的隨機整數(shù)。NextDouble和Next都是實例方法,所以在使用這些方法之前你必須先創(chuàng)建一個System.Random類型的對象。下面是一個完整的ASP.NET頁面,它顯示了如何運用這些方法生成20個隨機數(shù)字,其中10個隨機數(shù)字處于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函數(shù)的.NET框架類
' 隨機數(shù)生成方法
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>
下圖顯示了這個頁面的運行結(jié)果(當然,如果你運行這個頁面,得到的很可能是一組不同的隨機數(shù)字)。
前面我們討論了.NET Framework中程序集、名稱空間和類如何結(jié)合成一個整體,以及如何利用內(nèi)建的System類進行數(shù)學計算和生成隨機數(shù)字。本文的第二部分將接著討論其他幾個有用的類,包括Array類、String類、DateTime類等。