Инициализация Generic.List в С# - программирование
Подтвердить что ты не робот

Инициализация Generic.List в С#

В С# я могу инициализировать список, используя следующий синтаксис.

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

Я хотел бы знать, как работает синтаксис {}, и если он имеет имя. Существует конструктор, который принимает IEnumerable, вы можете это назвать.

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

Это кажется более "стандартным". Когда я деконструирую конструктор по умолчанию для списка, я вижу только

this._items = Array.Empty;

Я хотел бы иметь возможность сделать это.

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

И иметь возможность использовать список 1, 2, 3. Как это работает?

Обновить

Джон Скит ответил

Он вызывает без параметров конструктор, а затем вызовите Add:

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

Я понимаю, что делает. Я хочу знать, как это сделать. Как этот синтаксис знает, чтобы вызвать метод Add?

Обновление

Я знаю, как клише принять ответ Джона Скита. Но, пример со строками и ints является удивительным. Также очень полезной страницей MSDN является:

4b9b3361

Ответ 1

Это называется инициализатором коллекции. Он вызывает конструктор без параметров, а затем вызывает Add:

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

Требования для типа:

  • Он реализует IEnumerable
  • Он имеет перегрузки Add, которые подходят для типов аргументов, которые вы поставляете. Вы можете предоставить несколько аргументов в фигурных скобках, и в этом случае компилятор ищет метод Add с несколькими параметрами.

Например:

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

Затем вы можете использовать:

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

(Конечно, обычно вы хотите, чтобы ваша коллекция реализовала IEnumerable правильно...)

Ответ 3

Они называются инициализаторы коллекций (также см. здесь), и способ, которым они работают, - это искать метод Add(), который может выполнять свои ставки. Он вызывает Add() для каждого из целых чисел, которые у вас есть в фигурных скобках.

Поиск метода Add() - это чистая магия компилятора. Он жестко запрограммирован для поиска метода этого имени.

Ответ 5

Я считаю это ярлыком для метода .Add. Я никогда не пытался переопределить его, поэтому я не знаю, возможно ли это.

Ответ 6

Насколько мне известно, добавление элементов через инициализацию объектов выполняет поиск метода Add. Итак, поскольку List <int> будет иметь void Add (int), он будет работать.

Чтобы использовать его в своем классе, просто добавьте

class CustomClass { 
   public void Add(int num) {
      // Your code here
   }
}

Ваш класс должен реализовать IEnumerable, как указал Халлгрим.

Ответ 7

Фактически используется метод .Add. Это означает, что он вызывает .Add для каждого элемента в скобках внутри конструктора.