我对C#中的OOP有“最佳实践”问题(但它适用于所有语言)。
考虑使库类具有要通过属性访问器公开的对象,但是我们不希望公众(使用此库类的人)对其进行更改。
class A
{
// Note: List is just example, I am interested in objects in general.
private List<string> _items = new List<string>() { "hello" }
public List<string> Items
{
get
{
// Option A (not read-only), can be modified from outside:
return _items;
// Option B (sort-of read-only):
return new List<string>( _items );
// Option C, must change return type to ReadOnlyCollection<string>
return new ReadOnlyCollection<string>( _items );
}
}
}
显然,最好的方法是“选项C”,但是很少有具有ReadOnly变体的对象(当然,没有用户定义的类具有它)。
如果您是A类的用户,您是否希望更改为
List<string> someList = ( new A() ).Items;
传播到原始(A)对象?还是返回一个克隆(如果它在注释/文档中是这样写的)可以吗?我认为这种克隆方法可能会导致很难跟踪的错误。
我记得在C ++中我们可以返回const对象,并且您只能在其上调用标记为const的方法。我想C#中没有这样的功能/样式?如果不是,为什么不包括呢?我相信这称为const正确性。
但是,我的主要问题还是关于“您会期望什么”或如何处理选项A与B。