我多次遇到这个设计问题,但从未找到一个完美的解决方案。
我想要暴露一个集合,在持有者类作用域下可编辑,但在其他公共作用域下只可读。
尝试1:
public class MyClass
{
private List<object> _myList = new List<object>();
public IEnumerable<object> MyList { get { return _myList; } }
}
这样做的问题在于外部代码可以将其强制转换回
List
并进行编辑,就像这样:var x = ((List<object>)MyList);
Trial 2:
public class MyClass
{
private List<object> _myList = new List<object>();
public IEnumerable<object> MyList { get { return _myList.ToList(); } }
}
这种方法可以防止外部修改,但会造成多次复制 List
的不必要开销。
试验3:
public class MyClass
{
private List<object> _myList = new List<object>();
private ReadOnlyCollection<object> _roList =
new ReadOnlyCollection<object>(_myList)
public IEnumerable<object> MyList { get { return _roList; } }
}
这是标准解决方案,目前我正在使用,但ReadOnlyCollection
要慢大约30%:
Debug Trace:
Use normal foreach on the ReadOnlyCollection
Speed(ms): 2520,3203125
Result: 4999999950000000
use<list>.ForEach
Speed(ms): 1446,1796875
Result: 4999999950000000
Use normal foreach on the List
Speed(ms): 1891,2421875
Result: 4999999950000000
有没有一种“完美”的方法来做到这一点?谢谢。
IEnumerable
才能工作,那么就必须是这样。如果你的意思是它是一个IEnumerable
,但不是object
类型的其他类型,那么也可以。只要底层集合是那种类型即可。 - Paul Phillips