创建完整的readOnly对象列表的最佳方法

时间:2015-03-12 09:08:54

标签: c# list caching readonly readonly-collection

我正在使用C# 4.0Asp.Net。关于在我创建的自定义缓存中正确构造readonly结构,我遇到了问题。

详情(摘要):
我的CacheManager类(singleton)使用现有MemoryCache类的实例作为参数,并包含一些有用的方法来处理补充内容,例如我的自定义缓存中的对象生命周期。

该经理处理一个简单的CachableObject,它带有三个变量:

  • object
  • DateTime
  • int(持续时间)

总之,我的自定义缓存管理器在有限的时间内存储objects,以保护我的数据库免受频繁的大查询。

最近,我试图:

  • 从缓存中获取一个对象(即:存储在密钥-MyList下)
  • 将其转换回复杂对象列表
  • 翻译每个复杂对象的某些属性的内容
  • 再次存储缓存中新近翻译的对象列表(在另一个键-MyTranslatedList下)

问题:
在我的测试过程中,在我看来,存储在缓存中的两个列表(原始的和已翻译的)都引用了相同的底层对象。因此,一旦翻译,这些对象实际上都在两个列表中翻译。
由于每个列表只有对象的引用,这是一个非常正常的行为,也是我的一个愚蠢的错误。

问题:
正如您现在可以很容易地猜到的那样,我想保护自己和我的单身人士的其他用户以防止这种错误。

我想插入(或存储或获取)任何类型的对象(或复杂对象列表),以便任何人通过缓存都无法更改它们。我希望我的缓存中的数据只读(并且深度只读)以避免出现这种问题。在开始使用缓存中存储的数据之前,我希望任何人拥有来创建深层副本(甚至更好,获取一个)。

到目前为止我尝试了什么:
我试图只读object。它没有按预期工作。

由于我经常存储复杂对象的列表,我找到了返回IReadOnlyCollection的AsReadOnly方法,但是这会阻止我改变列表(添加,删除),它不会#39;保护列表中的对象。

我希望我的解释有点可以理解:)是否有一种处理这种情况的巧妙方法?

1 个答案:

答案 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);
    }

祝你好运   汉斯米林......