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"的属性就可以了.
这是非常重要的,你明白改变字段的值之间的差值(使它引用不同的实例),并改变对象的内容,该字段指.