如何使引用类型属性"只读"

Joe*_* Gö 11 c# encapsulation properties readonly

我有一个Bar包含引用类型的私有字段的类Foo.我想Foo在一个公共财产中公开,但我不希望财产的消费者能够改变Foo......但是它应该在内部可以改变Bar,即我不能进入该领域readonly.

所以我想要的是:

      private _Foo;

      public Foo 
      { 
         get { return readonly _Foo; } 
      } 
Run Code Online (Sandbox Code Playgroud)

......当然无效.我可以回复一个克隆Foo(假设它是IClonable),但这对消费者来说并不明显.我应该将属性的名称更改为FooCopy?? 它应该是一种GetCopyOfFoo方法吗?你认为最佳做法是什么?谢谢!

Jon*_*eet 11

这听起来像是在等待C++的"const"之后.这在C#中不存在.没有办法表明消费者不能修改对象的属性,但其他东西可以(假设变异成员是公共的,当然).

您可以按照建议返回Foo的克隆,或者可能返回Foo的视图,就像ReadOnlyCollection对集合一样.当然如果你可以制作Foo一个不可变的类型,那会让生活更简单......

请注意,使字段只读并使对象本身不可变之间存在很大差异.

目前,类型本身可以以两种方式改变事物.它可以做到:

_Foo = new Foo(...);
Run Code Online (Sandbox Code Playgroud)

要么

_Foo.SomeProperty = newValue;
Run Code Online (Sandbox Code Playgroud)

如果它只需要能够做第二个,那么该字段可能是只读的,但你仍然有人提取属性能够改变对象的问题.如果它只需要做第一个,并且实际上Foo要么已经是不可变的,要么可以变成不可变的,你只需要提供一个只有"getter"的属性就可以了.

这是非常重要的,你明白改变字段的值之间的差值(使它引用不同的实例),并改变对象的内容,该字段指.