Тип данных инициализатора коллекции - PullRequest
0 голосов
/ 18 декабря 2018

Фон

При создании коллекции мы можем сделать довольно многословную совокупность ...

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 набор данных.

Вопросы

  1. Может кто-нибудь объяснить, что на самом деле происходит с Collection Initializer?
  2. Как можно элегантно разрешить Append() без ненужных экземпляров объекта?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...