3

我相信 C# 编译器在用于普通数组(例如 )时会重写foreach为 a 。但是,对于存储 a 的集合,装箱是否会因迭代其内容而产生?forint[]struct

例如,下面的代码是否依赖 boxing( IEnumerable<KeyValuePair<int,byte>>) 来迭代dict?

void DoSomething(Dictionary<int,byte> dict) {
    foreach(KeyValuePair<int,byte> itr in dict)
        m_correlation += itr.Key; }
4

2 回答 2

5

不,上面的代码没有装箱。

如果您将其用作IDictionary<int, byte>参数(或IEnumerable<KeyValuePair<int, byte>>),则枚举器本身将被装箱,因为字典类与许多集合一样,具有一个struct枚举器(每次调用时保存对象分配foreach)。

在上面的代码中,编译器将调用字典的GetEnumerator方法,而不是(隐式实现的)IEnumerable<T>方法。

于 2013-09-16T05:15:39.497 回答
1

不,不会的。

上面的任何东西不能装箱。你Dictionary已经是一个引用类型..并且 aKeyValuePair是一个struct. 编译器生成的调用GetEnumerator()将返回一个通用的 Enumerator struct.. ,但它是在dict.. 上调用的,它已经是一个引用类型。

于 2013-09-16T05:10:44.340 回答