2009-10-01 61 views
0

我正在使用C#和ASP.NET 3.5。在應用程序狀態下存儲通用列表

我在HttpContext.Current.Application中存儲了一個通用列表,以便網站的所有頁面都可以訪問它。當我將其值分配給本地頁面上的本地變量以供本地使用時,我對本地變量所做的任何更改都會反映迴應用程序狀態的原始列表中。當我在本地分配時,就好像直接引用了應用程序狀態變量。

下面是一些示例代碼,它實例化一個本地通用列表變量,向該變量添加3個字符串,將該變量添加到應用程序狀態,從本地變量中刪除一個項目,並打印出計數。結果是從本地變量中刪除的一個項目也從應用程序狀態的相應列表中刪除。

-- generic list in Application state 
    Response.Write("<BR><BR><b>list (generic) example in Application</b><BR><BR>"); 
    List<string> productList = new List<string>(); 
    productList.Add("1"); 
    productList.Add("2"); 
    productList.Add("3"); 
    HttpContext.Current.Application["productList"] = productList; 
    Response.Write("product segments: " + productList.Count + "<BR>"); 
    Response.Write("product segments in application cache: " + ((List<string>)HttpContext.Current.Application["productList"]).Count + "<BR>"); 

    productList.Remove("1"); 

    Response.Write("product segments: " + productList.Count + "<BR>"); 
    Response.Write("product segments in application cache: " + ((List<string>)HttpContext.Current.Application["productList"]).Count + "<BR>"); 

隨意在aspx文件中運行此代碼並自己查看結果。

問題:如何將泛型存儲在應用程序狀態中,以便可以將它們分配給局部變量,並且對該局部變量的更改不應該傳播迴應用程序狀態變量?

順便說一下,這也在會話狀態中發生。在應用程序或會話中存儲泛型時遺漏了什麼?

感謝您的幫助。

回答

1

你的問題是,List是一個引用類型,所以當你將productList分配給上下文...你真的只是添加一個對原始列表的引用。這就是爲什麼兩個位置都出現變化。

您需要克隆列表,而不是將現有列表分配給上下文。根據您是否並不需要一個淺拷貝與深拷貝,你可以使用下面的代碼:

HttpContext.Current.Application["productList"] = 
    new List<string>(productList); 

HttpContext.Current.Application["productList"] = 
    new List<string>(productList.Select(item => item.Clone()).ToList()); 
+0

謝謝,這使得事情點擊我的腦海。 – 2009-10-01 03:01:15

0

嘗試類似:

List<string> localList = new List<string>((List<string>)HttpContext.Current.Application["productList"]); 

在你的版本中,你實際上是通過局部引用變量修改存儲產品列表。如果您不想將更改傳播回主列表,您需要創建列表的本地副本(上面的代碼)。

+0

我想過這樣做,只是不知道爲什麼我需要。謝謝你的幫助。 – 2009-10-01 03:02:07