繁体   English   中英

如何解耦缓存项?

[英]how to decouple cache item?

我在执行基本操作时遇到问题。

技术:c#、Asp.net mvc

我正在获取缓存项并将其添加到视图包以在视图中显示它,

CacheItem temp= cache.GetCacheItem(key + "names");
ViewBag.name1=temp.Value;
VieBag.name2= temp.Value;
List<string> nameList= new List<string>();
nameList= (List<string>)temp.value;

稍后,如果我更改任何一个值,例如nameList[0]=null ,将导致所有剩余值的更改

我怎样才能将它们解耦?

List是一个引用类型,这意味着list不存储值,它只指向一个值,在这种情况下,list 的名称指向 memory 中的某个列表。 使用 operator =您不是在复制值,而是在该变量上的引用。 这是非引用类型的示例:

int a = 10; int b = a; b = 20

这样b的值为20a的值为10 ,因为int是一个值类型。

但是,对于列表,情况并非如此。

nameList= (List<string>)temp.value;

这意味着变量nameList将指向temp.value指向的完全相同的列表,并且对其中一个列表的任何更改都将反映到另一个列表中。

您需要将所有元素从一个列表复制到另一个。 在这种情况下:

foreach (var item in (List<string>)temp.value) { nameList.Add(String.Copy(item); }

注意String.Copy方法。 string也是一种引用类型,因此您需要创建它的副本。 list2.Add(item); 只会将现有项目(字符串)添加到列表nameList ,因此两个列表将在 memory 中包含相同的 object。

用户对象或任何其他对象也是如此。 如果要将这些对象添加到新列表,请复制 object。 所以不仅列表是一个引用类型,object 也是。 它可以深入 go,因为 object 可以包含另一个 object 作为其字段或属性,您还需要创建它的副本。

另一方面,如果您有例如int类型的元素列表,则不需要创建每个元素的副本,因为int不是引用类型,而是值类型。 但是,您仍然需要创建一个新列表,因为列表是一个引用类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM