46 votes

Initialisation d'une liste générique en C #

En C#, je peux initialiser une liste à l'aide de la syntaxe suivante.

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

Je voudrais qu' {} syntaxe fonctionne, et si il a un nom. Il y a un constructeur qui prend un IEnumerable, on pourrait appeler ça.

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

Celui qui semble le plus "standard". Quand je déconstruire le constructeur par défaut pour la Liste, je ne vois

this._items = Array.Empty;

Je voudrais être capable de faire cela.

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

Et être en mesure d'utiliser l' 1, 2, 3 de la liste. Comment cela fonctionne?

Mise à jour

Jon Skeet répondu

C'est l'appel de la sans paramètre constructeur, et puis de l'appel d'Ajouter:

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

Je comprends ce qui est fait. Je veux savoir comment. Comment est-ce que la syntaxe sais d'appeler la méthode Add?

Mise à jour

Oui, je sais, patron d'accepter un Jon Skeet réponse. Mais, l'exemple avec les cordes et l'ints est génial. Également très utile page MSDN est:

65voto

Jon Skeet Points 692016

Ceci est appelé un initialiseur de collection. Il appelle le constructeur sans paramètre, et puis de l'appel d'Ajouter:

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

Les exigences pour le type sont:

  • Il met en oeuvre IEnumerable
  • Il a surcharges de Add qui sont appropriés pour les types d'argument que vous fournissez. Vous pouvez fournir plusieurs arguments entre accolades, auquel cas le compilateur cherche une Add méthode avec plusieurs paramètres.

Par exemple:

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)");
    }
}

Vous pouvez ensuite utiliser:

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

(Bien sûr, normalement, vous voulez votre collection à mettre en oeuvre IEnumerable correctement...)

7voto

Cornel Points 1461

Lecture des initialiseurs d'objets et de collections (Guide de programmation C #) . En gros, vous pouvez le faire avec chaque type personnalisé qui est une liste (implémente IEnumerable).

4voto

mquander Points 32650

Ils sont appelés les initialiseurs de la collection (voir aussi ici), et la façon dont ils travaillent est de regarder pour un Add() méthode qui peut faire leur soumission. Il appelle Add() pour chacun des entiers que vous avez dans votre accolades.

La recherche de l' Add() méthode est pure compilateur de la magie. Il est codé en dur à trouver une méthode de ce nom.

2voto

JaredPar Points 333733

Le nom que vous recherchez est "Initialisation de la collection". Cela fonctionne sous le capot en recherchant une méthode nommée Ajouter sur le type de collection et en l'appelant pour chaque valeur que vous spécifiez.

Plus de détails: Initialiseurs d'objets et de collections (Guide de programmation C #)

1voto

Matt Grande Points 6230

Je crois que c'est un raccourci vers la méthode .Add. Cependant, je n'ai jamais essayé de passer outre, donc je ne sais pas si c'est possible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X