我有以下课程:
class SampleClass { private ArrayList mMyList; SampleClass() { // Initialize mMyList } public ArrayList MyList { get { return mMyList;} } }
我希望用户能够获得mMyList,这就是我通过属性公开"获取"的原因,但是我不希望他们对对象做出更改(即.MyList.Add(new Class());)以使其成为回到我班上的路.
我想我可以返回对象的副本,但这可能很慢,我正在寻找一种方法,它将提供编译时错误,通知用户他们不应该期望能够修改返回的值属性.
这可能吗?
使用ArrayList你是相当有限的,因为BCL中没有readonly非泛型集合类.快速而肮脏的解决方案是返回一种IEnumerable.
public IEnumerable MyList { get { return mMyList;} }
这实际上不会阻止某人转换为ArrayList,但默认情况下也不允许编辑
您可以通过调用ArrayList.ReadOnly返回有效的只读列表.但是它的返回类型是一个ArrayList,因此用户仍然可以使用.Add编译,但它会产生运行时错误.
使用ArrayList.ReadOnly()方法构造并返回列表周围的只读包装器.它不会复制列表,而只是围绕它创建一个只读包装器.为了获得编译时检查,您可能希望将只读包装器作为@nared建议的IEnumerable返回.
public IEnumerable MyList { get { return ArrayList.ReadOnly(mMyList); } }
只读集合只是一个带有包装器的集合,可以防止修改集合.如果对基础集合进行了更改,则只读集合会反映这些更改.
该方法是O(1)操作.
参考
只是为了扩展JaredPar的答案.正如他所说,返回实际的支持字段并不是完全安全的,因为用户仍然可以动态地将其IEnumerable
返回到ArrayList
.
我会写这样的东西,以确保没有对原始列表进行任何修改:
public IEnumerable MyList { get { foreach (object o in mMyList) yield return o; } }
然后,我可能会使用通用列表(IEnumerable
)完全类型安全.