47 Stimmen

Initialisierung einer Generic.List in C#

In C# kann ich eine Liste mit der folgenden Syntax initialisieren.

List<int> intList= new List<int>() { 1, 2, 3 };

Ich würde gerne wissen, wie das {} Syntax funktioniert, und ob es einen Namen hat. Es gibt einen Konstruktor, der ein IEnumerable könnte man das nennen.

List<int> intList= new List<int>(new int[]{ 1, 2, 3 });

Das scheint eher "Standard" zu sein. Wenn ich den Standardkonstruktor für die Liste dekonstruiere, sehe ich nur

this._items = Array.Empty;

Ich würde dies gerne tun können.

CustomClass abc = new CustomClass() {1, 2, 3};

Und in der Lage sein, die 1, 2, 3 Liste. Wie funktioniert das?

Update

Jon Skeet antwortete

Es ruft die Par Konstruktor und ruft dann Add auf:

List<int> tmp = new List<int>(); tmp.Add(1); tmp.Add(2); tmp.Add(3); List<int> intList = tmp;

Ich verstehe, was es bewirkt. Ich möchte wissen, wie. Woher weiß diese Syntax, dass sie die Methode Add aufrufen soll?

Update

Ich weiß, es ist klischeehaft, eine Antwort von Jon Skeet zu akzeptieren. Aber das Beispiel mit den Strings und Ints ist genial. Auch eine sehr hilfreiche MSDN-Seite ist:

66voto

Jon Skeet Punkte 1325502

Dies wird als Kollektionsinitialisierer . Er ruft den parameterlosen Konstruktor und dann Add auf:

List<int> tmp = new List<int>();
tmp.Add(1);
tmp.Add(2);
tmp.Add(3);
List<int> intList = tmp;

Die Anforderungen an den Typ sind:

  • Sie implementiert IEnumerable
  • Es hat Überladungen von Add die für die von Ihnen angegebenen Argumenttypen geeignet sind. Sie können mehrere Argumente in geschweiften Klammern angeben, in diesem Fall sucht der Compiler nach einem Add Methode mit mehreren Parametern.

Zum Beispiel:

public class DummyCollection : IEnumerable
{
    IEnumerator IEnumerable.GetEnumerator()
    {
        throw new InvalidOperationException("Not a real collection!");
    }

    public void Add(string x)
    {
        Console.WriteLine("Called Add(string)");
    }

    public void Add(int x, int y)
    {
        Console.WriteLine("Called Add(int, int)");
    }
}

Sie können dann verwenden:

DummyCollection foo = new DummyCollection
{
    "Hi",
    "There",
    { 1, 2 }
};

(Natürlich sollte Ihre Sammlung normalerweise IEnumerable richtig...)

7voto

Cornel Punkte 4556

Lire Objekt- und Sammlungsinitialisierer (C# Programmierhandbuch) . Im Grunde könnte man dies mit jedem benutzerdefinierten Typ, der eine Liste ist (implementiert IEnumerable).

4voto

mqp Punkte 66863

Man nennt sie Sammlungsinitialisierer (siehe auch aquí ), und die Art, wie sie funktionieren, ist die Suche nach einem Add() Methode, die ihre Wünsche erfüllen kann. Sie ruft Add() für jede der ganzen Zahlen, die Sie in geschweiften Klammern haben.

Die Suche nach dem Add() Methode ist reine Compiler-Magie. Es ist fest einprogrammiert, eine Methode dieses Namens zu finden.

2voto

JaredPar Punkte 699699

Der Name, den Sie suchen, ist "Collection Initializer". Er arbeitet unter der Haube, indem er nach einer Methode namens "Add" für den Sammlungstyp sucht und sie für jeden von Ihnen angegebenen Wert aufruft.

Weitere Einzelheiten: Objekt- und Sammlungsinitialisierer (C# Programmierhandbuch)

1voto

Matt Grande Punkte 11622

Ich glaube, es ist eine Abkürzung für die Methode .Add. Ich habe nie versucht, sie zu überschreiben, obwohl, so weiß ich nicht, ob es möglich ist.

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