我正在使用 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/