foreach循环在IEnumerable<struct>上是否应用装箱?

3
我相信当普通数组(例如int[])使用foreach时,C#编译器会将其重写为for。但是,对于存储struct的集合,遍历其内容是否会导致装箱?
例如,下面的代码是否依赖于装箱(IEnumerable<KeyValuePair<int,byte>>)来迭代dict的内容?
void DoSomething(Dictionary<int,byte> dict) {
    foreach(KeyValuePair<int,byte> itr in dict)
        m_correlation += itr.Key; }

你尝试过编译这样的代码,然后使用 ildasmilspy 查找生成的程序集中的 box 操作码吗? - Gabe
2个回答

5
不,上述代码没有装箱。
如果您使用IDictionary<int, byte>作为参数(或者IEnumerable<KeyValuePair<int,byte>>),则枚举器本身将被装箱,因为像许多集合一样,字典类具有struct枚举器(以在每次调用foreach时节省对象分配)。
在上面的代码中,编译器将调用字典的GetEnumerator方法,而不是(隐式实现的)IEnumerable<T>方法。

1

不会。

以上内容中的任何东西都无法装箱。您的Dictionary已经是引用类型,而KeyValuePair是一个struct。编译器生成的对GetEnumerator()的调用将返回一个通用的枚举器struct ... 但是这是在dict上调用的,而dict已经是引用类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接