複製代碼 代碼如下:protected void Page_Load(object sender, EventArgs e)
{
webinfo info = new webinfo();
Response.Write("有static的執行結果:" + webinfo.a + "<br />");
Response.Write("沒有static的執行結果:" + info.b);
}
public class webinfo
{
public static DateTime a = DateTime.Now;
public DateTime b = DateTime.Now;
}
下面內容多摘自該文章:結果是只要網站不重啟(代碼也不修改),那麼a的值是恒定不變的,即使將頁面關了重新開啟也一樣;而b則是重新整理就變化。如果你從事Asp.Net的開發,提起緩衝你可能首先會想到Output Cache、資料來源緩衝或者是基於System.Web.Caching.Cache的對象緩衝。實際上緩衝的目的就是把對象(資料)儲存在記憶體中,不用每次需要物件服務的時候都重新建立對象(相對耗時)。將對象聲明為static,那麼對象將在其所屬的類被載入AppDomain時初始化,這樣對象的生命週期與AppDomain同樣長,從而起到緩衝的目的。
設計思想
我們經常需要在應用程式中緩衝一些常用資料供全域使用以提升效能。如果需要緩衝的物件類型和數目是固定的,我們可能會直接將其聲明為static;如果我們需要緩衝的物件類型和數目是不定的,我們可能會藉助一個static Hashtable來實現。但是Hashtable有個缺陷:它沒有階層,它總是以鍵/值的形式來儲存資料,一個Key對應一個Value,如果我們想擷取相關聯的一組資料就會比較困難了。
XML文檔結構是樹形的,具有標準的階層。XPath用於從Xml文檔中選擇一個或多個結點。比如 "/BookStore/Book",選擇Book結點下的所有子結點。
SAF 中的快取服務通過一個在記憶體中動態構造的Xml文檔樹作為橋樑,將靜態(static)緩衝和XPath 這兩個技術結合了起來,支援使用XPath的文法來擷取Hashtable中對象。其中靜態緩衝進行實際的資料緩衝,XPath用於擷取資料對象。從程式員的角度來看,即是Hashtable的Key支援了XPath的文法,可以將原本“平板式”的Hashtable想象成為一個“樹形結構”,它的結點包含了緩衝的資料,我們通過標準的XPath到達結點(當然這隻是一個假象)並擷取資料。通過這種方式就可以使用XPath來一次擷取Hashtable中的多個相關資料對象。 簡單說,SAF快取服務是為了實現一個有層次(樹形)的緩衝結構,從而實現對緩衝更加靈活的操作。
而實際上是怎麼實現這一過程的呢?我們一步步來看:
1、首先在記憶體中動態構建一個 Xml文檔,它只包含一個根結點,可以任意命名,這裡將它命名為了Cache。
2、提供一個Xpath路徑:擷取對象(資料)前首先要儲存物件,存對象自然要先提供一個路徑(這裡稱為“路徑”,是因為它是一個XPath,實際上也就相當於Hashtable中的鍵Key)。
3、根據上一步提供的路徑,以Cache為根結點,逐層深入地建立XmlNode結點。
4、產生一個GUID,在葉結點上添加一個Key屬性,為這個Key屬性賦值為GUID。
5、在Hashtable中儲存物件,其中Hashtable的Key即為上一步產生的GUID,而Value為要儲存的對象。
使用這種方式,Hashtable的實際的Key,即動態產生的GUID對程式員來說是透明的,程式員在儲存/擷取對象時,只需要提供XPath運算式就可以。下面這幅圖說明了它們之間的關係:
這裡還需要再說明三點:
1、我們使用Hashtable儲存物件,可以直接將Hashtable聲明為static的,也可以將Hashtable聲明為instance的,但是將Hashtable所屬的對象聲明為static的。這裡應用了Singleton模式,先將對Hashtable的操作封裝成一個類,然後在這個類上應用Singleton模式,確保了這個類只有一個(這個類所維護的Hashtable執行個體自然也只有一個了)。很明顯,這個類包含了主要的邏輯,我們將之命名為Cache。
2、使用Hashtable的好處是可以儲存任何類型的對象,缺點是喪失了型別安全。有時候我們可能會想使用一個泛型集合類來取代Hashtable,比如Dictionary<T key, T value>。所以這裡又引入了Strategy模式,建立了一個ICacheStrategy介面,這個介面包括三個方法,分別用於添加、擷取、刪除對象。
3、用Xpath擷取結點時,可以是基於當前結點的相對路徑;也可以是基於根結點的絕對路徑。在本文的範常式序中,使用的是絕對路徑,顯然這樣更加方便一些。