我已经多次遇到这个设计问题,但从未找到一个杀手级的解决方案。
我想公开一个在所有者class
范围内可编辑但仅对其他公共范围可读的集合。
试验一:
public class MyClass
{
private List<object> _myList = new List<object>();
public IEnumerable<object> MyList { get { return _myList; } }
}
这样做的问题是外部代码可以将其转换回List
并编辑,如下所示:
var x = ((List<object>)MyList);
试验二:
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
有没有一种“完美”的方式来做到这一点?谢谢。