Was ist der beste Weg, um eine Liste als Readonly aufzudecken?
Posted: 05 Mar 2025, 03:42
Ich war schon oft in diesem Designproblem und habe nie eine Killer -Lösung gefunden.public class MyClass
{
private List _myList = new List();
public IEnumerable MyList { get { return _myList; } }
}
< /code>
Das Problem dabei ist ein externer Code kann ihn einfach in die Liste < /code> und bearbeiten: < /p>
zurückgebenvar x = ((List)MyList);
< /code>
Versuch 2: < /strong> < /p>
public class MyClass
{
private List _myList = new List();
public IEnumerable MyList { get { return _myList.ToList(); } }
}
< /code>
Auf diese Weise verhindern wir eine externe Änderung, erstellen jedoch einen unnötigen Überkopf des Kopierens der Liste < /code> oft.public class MyClass
{
private List _myList = new List();
private ReadOnlyCollection _roList =
new ReadOnlyCollection(_myList)
public IEnumerable MyList { get { return _roList; } }
}
< /code>
Dies ist die Standardlösung, die ich derzeit verwende, aber ReadonlyCollection < /code> ist etwa 30% langsamer: < /p>
Debug Trace:
Use normal foreach on the ReadOnlyCollection
Speed(ms): 2520,3203125
Result: 4999999950000000
use.ForEach
Speed(ms): 1446,1796875
Result: 4999999950000000
Use normal foreach on the List
Speed(ms): 1891,2421875
Result: 4999999950000000
< /code>
Gibt es eine 'perfekte' Art, dies zu tun? Danke.
{
private List _myList = new List();
public IEnumerable MyList { get { return _myList; } }
}
< /code>
Das Problem dabei ist ein externer Code kann ihn einfach in die Liste < /code> und bearbeiten: < /p>
zurückgebenvar x = ((List)MyList);
< /code>
Versuch 2: < /strong> < /p>
public class MyClass
{
private List _myList = new List();
public IEnumerable MyList { get { return _myList.ToList(); } }
}
< /code>
Auf diese Weise verhindern wir eine externe Änderung, erstellen jedoch einen unnötigen Überkopf des Kopierens der Liste < /code> oft.public class MyClass
{
private List _myList = new List();
private ReadOnlyCollection _roList =
new ReadOnlyCollection(_myList)
public IEnumerable MyList { get { return _roList; } }
}
< /code>
Dies ist die Standardlösung, die ich derzeit verwende, aber ReadonlyCollection < /code> ist etwa 30% langsamer: < /p>
Debug Trace:
Use normal foreach on the ReadOnlyCollection
Speed(ms): 2520,3203125
Result: 4999999950000000
use.ForEach
Speed(ms): 1446,1796875
Result: 4999999950000000
Use normal foreach on the List
Speed(ms): 1891,2421875
Result: 4999999950000000
< /code>
Gibt es eine 'perfekte' Art, dies zu tun? Danke.