Фон
При создании коллекции мы можем сделать довольно многословную совокупность ...
Foo a = new Foo();
a.Add("a");
a.Add("b");
или мы можем использовать более простой инициализатор коллекции следующим образом...
Foo a = new Foo() {"a", "b"};
Конечно, это предполагает, что вы реализовали соответствующие методы , как определено IEnumerable
.Забавно, что исходный код ienumerable.cs ничего не говорит о Add()
, не говоря уже о типе данных, который передается методу.Здесь происходит какое-то «жуткое действие на расстоянии» .
Как примечание, это всегда плохой знак, когда на тип данных, на который ссылается, есть пробел (что недопустимо для типов данных).Документация C #, кажется, указывает на это для наших Collection Initializer
(если это так).
Рассмотрим более сложный Foo
, содержащий key:value
пар...
Foo a = new Foo() {
{"alpha": "Hello"},
{"beta": "World"}
};
Синтаксис конечно выглядит как Dictionary
, но при установке точки останова на вложенный метод Foo.Add()
, единственное, что этоработают с отдельными записями в этом списке.
Кроме того, отдельная запись (например, {"alpha": "Hello"}
) явно не передается методу;отдельные элементы в этом «массиве» (?) применяются к методу как отдельные аргументы.
public void Add(string key, string value) { ... }
C # преподносится как строго типизированный язык, но здесь мы никогда не объявляем типы нашего ввода.Я могу только предположить, что компилятор (?) Ищет в классе подходящий Add
метод с соответствующей подписью и вызывает, выделяя отдельные значения, по одному за раз.
"ОК", что можетпередать компилятор быстро и без ошибок, но что, если мы захотим реализовать метод Foo.Append()
, который берет Collection Initializer
и добавляет его в конец нашего экземпляра Foo?Было бы неплохо просто написать
a.Append({
{"gamma": "I Like"},
{"delta": "turtles."}
});
Однако, это отклонено компилятором.Можно представить себе создание new Dictionary()
с парами key:value
только для того, чтобы перейти к нашему методу ... но зачем?Особенно, если его просто собираются утилизировать, ввести в нашу цель Foo
набор данных.
Вопросы
- Может кто-нибудь объяснить, что на самом деле происходит с
Collection Initializer
? - Как можно элегантно разрешить
Append()
без ненужных экземпляров объекта?