这是什么类型的财产?有必要吗?

mrb*_*lah 2 c# nhibernate

在创建映射时,我正在读取您的集合属性应如下所示:

  public virtual ReadOnlyCollection<Product> Products
  {
           get { return new ReadOnlyCollection<Product>(new List<Product>(_products).AsReadOnly()); }
  }
Run Code Online (Sandbox Code Playgroud)

为什么它必须是这样的?它似乎每次被引用时返回一个新的集合?

LBu*_*kin 7

它返回一个包装类实例,阻止调用者能够直接修改您要返回的集合.

如果您只是简单地返回基础列表,则任何调用者都可以以可能破坏实际拥有该列表的类的方式更改它.

即使您将列表作为只读接口(例如IEnumerable或ICollection)返回,也不会阻止调用者执行运行时转换并进入列表.

通过返回的包装对象,可以防止来电永远能够改变列表.包装器不公开任何允许更改基础列表的方法,并且尝试转换包装器对象将失败.包装器不会复制数据 - 它只是保留对列表的引用,并阻止写入操作.

在ORM映射的情况下,这允许对象模型控制在哪个访问点可以改变对象之间的关系.