私はこの設計上の問題を何度も回避してきましたが、致命的な解決策は見つかりませんでした。
class
所有者スコープで編集可能であるが、他のパブリック スコープでのみ読み取り可能なコレクションを公開したいと考えています。
試行 1:
public class MyClass
{
private List<object> _myList = new List<object>();
public IEnumerable<object> MyList { get { return _myList; } }
}
これに関する問題は、外部コードが次のようにキャストしてList
編集できることです。
var x = ((List<object>)MyList);
試行 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
これを行う「完璧な」方法はありますか?ありがとう。