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

标签 c# generics caching

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

我在 HttpContext.Current.Application 中存储了一个通用列表,以便网站的所有页面都可以访问它。当我将其值分配给本地页面上的本地变量以供本地使用时,我对本地变量所做的任何更改都会反射(reflect)在应用程序状态的原始列表中。当我在本地分配应用程序状态变量时,就好像直接引用了它。

下面是一些示例代码,它实例化一个本地通用列表变量,向该变量添加 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状态下。在应用程序或 session 中存储泛型时我缺少什么?

感谢您的帮助。

最佳答案

您的问题是 List 是引用类型,因此当您将 ProductList 分配给 Context 时...您实际上只是添加了对原始列表的引用。这就是为什么两个位置都会出现更改的原因。

您需要克隆列表,而不是仅仅将现有列表分配给上下文。根据您是否需要浅复制或深复制,您可以使用以下代码:

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

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

关于c# - 在应用程序状态中存储通用列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1501421/

相关文章:

azure - 依赖 StackExchange.Redis.Extensions.Core 2.4.0 不支持框架 .NetStandard,Version=v1.6

c# - 使用 LINQ 更新 DataTable 中的两列

c# - 测试具有不同值的函数

vb.net - 帮助使用 Linq 和泛型。在查询中使用 GetValue

java - 为什么我不能分配给这个通用变量?

caching - 如何记住匿名投票

javascript - 如何告诉 Chrome 清除网站的缓存和 cookie?

c# - OleDB 连接仅在调试时有效

c# - MVC - 字符串或二进制数据将被截断。\r\n语句已终止

swift - 为什么在尝试对通用 ArraySlice 调用 indexOf 时会出现错误?