我正在使用C# 4.0
,Asp.Net
。关于在我创建的自定义缓存中正确构造readonly
结构,我遇到了问题。
详情(摘要):
我的CacheManager类(singleton)使用现有MemoryCache
类的实例作为参数,并包含一些有用的方法来处理补充内容,例如我的自定义缓存中的对象生命周期。
该经理处理一个简单的CachableObject
,它带有三个变量:
object
DateTime
int
(持续时间)总之,我的自定义缓存管理器在有限的时间内存储objects
,以保护我的数据库免受频繁的大查询。
最近,我试图:
-MyList
下)-MyTranslatedList
下) 问题:
在我的测试过程中,在我看来,存储在缓存中的两个列表(原始的和已翻译的)都引用了相同的底层对象。因此,一旦翻译,这些对象实际上都在两个列表中翻译。
由于每个列表只有对象的引用,这是一个非常正常的行为,也是我的一个愚蠢的错误。
问题:
正如您现在可以很容易地猜到的那样,我想保护自己和我的单身人士的其他用户以防止这种错误。
我想插入(或存储或获取)任何类型的对象(或复杂对象列表),以便任何人通过缓存都无法更改它们。我希望我的缓存中的数据只读(并且深度只读)以避免出现这种问题。在开始使用缓存中存储的数据之前,我希望任何人拥有来创建深层副本(甚至更好,获取一个)。
到目前为止我尝试了什么:
我试图只读object
。它没有按预期工作。
由于我经常存储复杂对象的列表,我找到了返回IReadOnlyCollection
的AsReadOnly方法,但是这会阻止我改变列表(添加,删除),它不会#39;保护列表中的对象。
我希望我的解释有点可以理解:)是否有一种处理这种情况的巧妙方法?
答案 0 :(得分:0)
我会创建一个属性为readonly的类:
class ReadonlyClass
{
private string p1;
private int p2;
public ReadonlyClass(string property1, int property2)
{
p1 = property1;
p2 = property2;
}
public string Property1
{
get { return p1; }
}
public int Property2
{
get { return p2; }
}
}
如果属性是对象/其他类,则应实现返回对象副本的克隆函数。上面这个类的克隆函数会像这样说:
public ReadonlyClass clone()
{
return new ReadonlyClass(p1, p2);
}
祝你好运 汉斯米林......