506 Stimmen

ArrayList vs List<> in C# ArrayList vs List<> in C#

Was ist der Unterschied zwischen ArrayList und List<> in C#?

Ist es nur so, dass List<> einen Typ hat, während ArrayList keinen hat?

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 nach List 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/…

644voto

mmx Punkte 400975

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.

0 Stimmen

Würden Sie bitte erklären, warum Sie "Boxing" verwendet haben und nicht "Casting"? Welches Boxing findet hier statt? Werden Objekte allokiert/deallokiert?

3 Stimmen

@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.

0 Stimmen

Ich habe mich gefragt, ob das Framework einschränken sollte, dass T vom Typ "Object" sein sollte, da ArrayList dies implizit zulässt.

125voto

termas Punkte 1259

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

0 Stimmen

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.

2 Stimmen

I +1 zur Rechtfertigung, aber Sie können immer noch if(num ist int){} zu Ihrer Array-Liste hinzufügen, um Fehler zu vermeiden

1 Stimmen

Verhindern Sie Typenfehler und unnötige Umwandlungsvorgänge. Das sind im Grunde genommen die Gründe für Generika im Allgemeinen.

35voto

Anoop Punkte 818

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

8 Stimmen

Das gilt nur für das Speichern von Werttypen, nicht von Referenztypen. Der Unterschied liegt daran, dass ein ArrayList nur Zeiger enthalten kann und die Daten selbst anderswo gespeichert werden müssen. Andererseits können Werttypen direkt in einer Liste gespeichert werden.

23voto

NullReference Punkte 2588

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

0 Stimmen

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.

1 Stimmen

Wenn Sie Thread-Sicherheit wünschen, empfehle ich, das System.Collections.Concurrent-Namespace zu betrachten, bevor Sie ArrayList in Betracht ziehen.

23voto

Aravin Punkte 5844

Einfache Antwort ist,

ArrayList ist nicht generisch

  • Es ist ein Object-Typ, daher können Sie jeden Datentyp darin speichern.
  • Sie können beliebige Werte (Werttyp oder Verweistyp) wie Zeichenfolge, int, Mitarbeiter und Objekt in das ArrayList speichern. (Anmerkung und)
  • Boxing und Unboxing werden stattfinden.
  • Nicht typsicher.
  • Es ist älter.

List ist generisch

  • Es ist ein Typ von Typ, daher können Sie das T zur Laufzeit angeben.
  • Sie können nur einen Wert des Typs T (Zeichenfolge oder int oder Mitarbeiter oder Objekt) entsprechend der Deklaration speichern. (Anmerkung oder)
  • Boxing und Unboxing werden nicht stattfinden.
  • Typsicher.
  • Es ist neuer.

Beispiel:

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/

Gib eine Bildbeschreibung ein

Anmerkung: Sie sollten Generics kennen, bevor Sie den Unterschied verstehen: https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/

0 Stimmen

Ich freue mich, dass es dir hilft @zahrakhani

CodeJaeger.com

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.

Powered by:

X