在应用程序状态中存储通用列表

时间:2009-10-01 01:05:09

标签: c# generics caching

我正在使用C#和ASP.NET 3.5。

我在HttpContext.Current.Application中存储了一个通用列表,以便网站的所有页面都可以访问它。当我将其值分配给本地页面上的局部变量以供本地使用时,我对局部变量所做的任何更改都会反映在应用程序状态的原始列表中。当我在本地分配它时,就好像正在引用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文件中运行此代码,并亲自查看结果。

问题:如何在应用程序状态中存储泛型,以便可以将它们分配给局部变量,并且对该局部变量的更改不应传播回应用程序状态变量?

顺便说一下,这也发生在Session状态。在应用程序或会话中存储泛型时我缺少什么?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

你的问题是List是一个引用类型,所以当你将productList分配给Context时......你实际上只是添加了对原始列表的引用。这就是为什么变化出现在两个位置的原因。

您需要克隆列表而不是仅将现有列表分配给Context。根据您是否需要浅拷贝与深拷贝,您可以使用以下代码:

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

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

答案 1 :(得分:0)

尝试类似:

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

在您的版本中,您实际上是通过本地参考变量修改存储的产品列表。如果您不希望更改传播回主列表,则需要创建列表的本地副本(上述代码可以执行此操作)。