.NET neigt dazu, von Arrays für alle außer den einfachsten und traditionellsten Anwendungsfällen abzulenken. Für alles andere gibt es verschiedene Aufzählungs-/Sammlungsimplementierungen.
Wenn Sie eine Gruppe von Daten als unveränderbar markieren möchten, gehen Sie über die von einem herkömmlichen Array bereitgestellten Funktionen hinaus. .NET bietet die gleiche Funktionalität, jedoch nicht technisch in Form eines Arrays. Um eine unveränderliche Sammlung aus einem Array zu erhalten, verwenden Array.AsReadOnly<T>
:
var mutable = new[]
{
'a', 'A',
'b', 'B',
'c', 'C',
};
var immutable = Array.AsReadOnly(mutable);
immutable
wird eine ReadOnlyCollection<char>
Instanz sein. Als allgemeinerer Anwendungsfall können Sie eine ReadOnlyCollection<T>
aus einer generischen IList<T>
Implementierung erstellen.
var immutable = new ReadOnlyCollection<char>(new List<char>(mutable));
Beachten Sie, dass es sich um eine generische Implementierung handelt; plain old IList
wird nicht funktionieren, was bedeutet, dass Sie diese Methode nicht für ein traditionelles Array verwenden können, das nur IList
implementiert. Dies zeigt die Möglichkeit, Array.AsReadOnly<T>
als eine schnelle Möglichkeit zu verwenden, um Zugriff auf generische Implementierungen zu erhalten, die normalerweise nicht über ein herkömmliches Array zugänglich sind.
ReadOnlyCollection<T>
geben Sie Zugriff auf alle Funktionen, die Sie von einem unveränderlichen Array erwarten:
// Note that .NET favors Count over Length; all but traditional arrays use Count:
for (var i = 0; i < immutable.Count; i++)
{
// this[] { get } is present, as ReadOnlyCollection<T> implements IList<T>:
var element = immutable[i]; // Works
// this[] { set } has to be present, as it is required by IList<T>, but it
// will throw a NotSupportedException:
immutable[i] = element; // Exception!
}
// ReadOnlyCollection<T> implements IEnumerable<T>, of course:
foreach (var character in immutable)
{
}
// LINQ works fine; idem
var lowercase =
from c in immutable
where c >= 'a' && c <= 'z'
select c;
// You can always evaluate IEnumerable<T> implementations to arrays with LINQ:
var mutableCopy = immutable.ToArray();
// mutableCopy is: new[] { 'a', 'A', 'b', 'B', 'c', 'C' }
var lowercaseArray = lowercase.ToArray();
// lowercaseArray is: new[] { 'a', 'b', 'c' }
Diese Eigenschaft einen Namen fehlen, ist es nicht? – Svish
Die Eigenschaft heißt "unveränderlich" - in diesem Sinne sind Strings unveränderlich (außer Sie greifen auf den Char-Zeiger in unsicheren Code zu, den Sie wirklich nicht tun sollten, weil sie interniert sind.) –
Denken Sie daran, dass ein unveränderliches Array ist nur so unveränderlich wie seine Mitglieder. @PhilWhittinton Er meinte im Code, der Eigenschaft fehlt ein Name. Es ist syntaktisch falsch. Es ist jedoch nicht wirklich ein funktionierendes Beispiel. – Zenexer