Was ist der Unterschied zwischen ArrayList
und List<>
in C#?
Ist es nur so, dass List<>
einen Typ hat, während ArrayList
keinen hat?
Was ist der Unterschied zwischen ArrayList
und List<>
in C#?
Ist es nur so, dass List<>
einen Typ hat, während ArrayList
keinen hat?
Ja, ziemlich genau. List
ist eine generische Klasse. Sie unterstützt das Speichern von Werten eines bestimmten Typs ohne Umwandlung in oder aus object
(was bei T
als Werttyp im Fall von ArrayList
zu einer zusätzlichen Ausführungszeitbelastung gekommen wäre). ArrayList
speichert einfach object
-Verweise. Als generische Sammlung implementiert List
das generische IEnumerable
-Interface und kann leicht in LINQ verwendet werden (ohne dass ein Cast
oder OfType
-Aufruf erforderlich ist).
ArrayList
gehört zu den Zeiten, in denen C# keine Generika hatte. Es ist veraltet zugunsten von List
. Sie sollten ArrayList
in neuem Code, der auf .NET >= 2.0 abzielt, nicht verwenden, es sei denn, Sie müssen mit einer alten API interagieren, die es verwendet.
Würden Sie bitte erklären, warum Sie "Boxing" verwendet haben und nicht "Casting"? Welches Boxing findet hier statt? Werden Objekte allokiert/deallokiert?
@BenjaminGruenbaum Du hast recht, dass Casting allgemeiner wäre. Die wirkliche Unterschied liegt jedoch zur Laufzeit darin, wenn du mit Werttypen umgehst (was ich angenommen habe, als ich von "Boxing" schrieb). Bei Referenztypen ist das Verhalten zur Laufzeit effektiv das Gleiche wie bei ArrayList
. Statisch betrachtet wird jedoch ein Casting mit ArrayList
erforderlich sein.
Ich habe mich gefragt, ob das Framework einschränken sollte, dass T vom Typ "Object" sein sollte, da ArrayList dies implizit zulässt.
Bei Verwendung von List
können Sie Typumwandlungsfehler verhindern. Es ist sehr nützlich, um einen Laufzeit-Umwandlungsfehler zu vermeiden.
Beispiel:
Hier (bei Verwendung von ArrayList
) können Sie diesen Code kompilieren, aber später einen Ausführungsfehler sehen.
ArrayList array1 = new ArrayList();
array1.Add(1);
array1.Add("Pony"); //Kein Fehler im Kompilierungsprozess
int total = 0;
foreach (int num in array1)
{
total += num; //-->Laufzeitfehler
}
Wenn Sie List
verwenden, vermeiden Sie diese Fehler:
List list1 = new List();
list1.Add(1);
//list1.Add("Pony"); //<-- Fehler im Kompilierungsprozess
int total = 0;
foreach (int num in list1 )
{
total += num;
}
Referenz: MSDN
Sie können den Typ überprüfen, wenn Sie aus dem ArrayList ziehen, um Casting-Fehler zu vermeiden. Heutzutage verwenden die Leute das Objekt, sodass ArrayList nicht mehr benötigt wird.
I +1 zur Rechtfertigung, aber Sie können immer noch if(num ist int){} zu Ihrer Array-Liste hinzufügen, um Fehler zu vermeiden
Um zu den obigen Punkten hinzuzufügen. Die Verwendung von ArrayList
in einem 64-Bit-Betriebssystem benötigt doppelt so viel Speicher wie in einem 32-Bit-Betriebssystem. Andererseits benötigt eine generische Liste List
viel weniger Speicher als das ArrayList
.
Zum Beispiel, wenn wir ein ArrayList
von 19MB in einem 32-Bit-System verwenden, würde es in einem 64-Bit-System 39MB benötigen. Aber wenn Sie eine generische Liste List
von 8MB in einem 32-Bit-System haben, würde sie nur 8,1MB in einem 64-Bit-System benötigen, was einen beeindruckenden Unterschied von 481% im Vergleich zu ArrayList darstellt.
Quelle: ArrayList vs. generische Liste für primitive Datentypen und 64-Bit
Ein weiterer Unterschied, der hinzuzufügen ist, betrifft die Thread-Synchronisierung.
ArrayList
bietet etwas Thread-Sicherheit durch die Synchronized-Eigenschaft, die einen thread-sicheren Wrapper um die Sammlung zurückgibt. Der Wrapper funktioniert, indem er die gesamte Sammlung bei jeder Hinzufügen- oder Entfernenoperation sperrt. Daher muss jeder Thread, der versucht, auf die Sammlung zuzugreifen, auf seine Ausführung warten, um das eine Schloss zu nehmen. Dies ist nicht skalierbar und kann bei großen Sammlungen zu einer erheblichen Leistungsminderung führen.
List
bietet keine Thread-Synchronisierung; Benutzercode muss für die gesamte Synchronisierung sorgen, wenn Elemente gleichzeitig auf mehreren Threads hinzugefügt oder entfernt werden.
Mehr Informationen hier Thread-Synchronisierung im .Net Framework
Ich sage nicht, dass du ArrayList
verwenden solltest, wenn es vermieden werden kann, aber das ist ein dummer Grund. Der Wrapper ist schließlich ganz optional; Wenn du keine Sperrung benötigst oder eine genauere Kontrolle benötigst, verwende den Wrapper nicht.
Einfache Antwort ist,
ArrayList arrayList = new ArrayList();
List list = new List();
arrayList.Add(1);
arrayList.Add("String");
arrayList.Add(new object());
list.Add(1);
list.Add("String"); // Kompilierungsfehler
list.Add(new object()); // Kompilierungsfehler
Bitte lesen Sie das offizielle Dokument von Microsoft: https://blogs.msdn.microsoft.com/kcwalina/2005/09/23/system-collections-vs-system-collection-generic-and-system-collections-objectmodel/
Anmerkung: Sie sollten Generics kennen, bevor Sie den Unterschied verstehen: https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
7 Stimmen
Mögliche Duplikate von ArrayList vs List
9 Stimmen
Es ist eine ähnliche Frage, aber ich glaube nicht genau dasselbe. Hier wird allgemein nach
List<>
gefragt, während die andere spezifisch nachList fragt.
0 Stimmen
Ich habe diesen sehr hilfreichen Blog gefunden, es könnte helfen. Ich dachte, ich sollte den Link teilen: fintechexplained.blogspot.co.uk/2017/07/…