Инициализация 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 является:
Ответы
Ответ 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
правильно...)
Ответ 2
Прочитайте Инициализаторы объектов и коллекций (Руководство по программированию на С#). В основном вы можете это сделать с каждым настраиваемым типом, который является списком (реализует IEnumerable).
Ответ 3
Они называются инициализаторы коллекций (также см. здесь), и способ, которым они работают, - это искать метод Add()
, который может выполнять свои ставки. Он вызывает Add()
для каждого из целых чисел, которые у вас есть в фигурных скобках.
Поиск метода Add()
- это чистая магия компилятора. Он жестко запрограммирован для поиска метода этого имени.
Ответ 4
Название, которое вы ищете, это "Инициализатор коллекции". Он работает под капотом, ища метод Add по типу коллекции и вызывая его для каждого указанного вами значения.
Подробнее: Инициализаторы объектов и коллекций (Руководство по программированию на С#)
Ответ 5
Я считаю это ярлыком для метода .Add. Я никогда не пытался переопределить его, поэтому я не знаю, возможно ли это.
Ответ 6
Насколько мне известно, добавление элементов через инициализацию объектов выполняет поиск метода Add. Итак, поскольку List <int> будет иметь void Add (int), он будет работать.
Чтобы использовать его в своем классе, просто добавьте
class CustomClass {
public void Add(int num) {
// Your code here
}
}
Ваш класс должен реализовать IEnumerable, как указал Халлгрим.
Ответ 7
Фактически используется метод .Add
. Это означает, что он вызывает .Add
для каждого элемента в скобках внутри конструктора.