集合初始化器的数据类型

时间:2018-12-18 18:30:21

标签: c# collections

背景

创建集合时,我们可以进行大量的填充...

Foo a = new Foo();
a.Add("a");
a.Add("b");

或者我们可以如下使用一个更简单的collection initializer ...

Foo a = new Foo() {"a", "b"};

当然,这是假设您已实现IEnumerable所定义的appropriate methods。有趣的是,ienumerable.cs源代码没有说明Add(),更不用说传递给该方法的数据类型了。这里有一些"spooky action at a distance"

  

作为旁注,当数据类型暗示为   其中有一个空格(对于数据类型而言是非法的)。 C#   文档似乎为我们的Collection Initializer指出了这一点(如果   就是这样)。

考虑一个更复杂的Foo,其中包含key:value对...

Foo a = new Foo() {
    {"alpha": "Hello"},
    {"beta": "World"}
};

The syntax当然看起来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()

0 个答案:

没有答案