foreach 是否在 IEnumerable 上应用装箱
本文关键字:应用 struct 是否 IEnumerable foreach | 更新日期: 2023-09-27 18:31:28
我相信C#编译器在普通数组(例如int[]
)上使用时会foreach
重写为for
。但是,对于存储struct
的集合,装箱是否会导致迭代其内容?
例如,下面的代码是否依赖于装箱(IEnumerable<KeyValuePair<int,byte>>
)来迭代dict
的内容?
void DoSomething(Dictionary<int,byte> dict) {
foreach(KeyValuePair<int,byte> itr in dict)
m_correlation += itr.Key; }
不,上面的代码不装箱。
如果您使用 IDictionary<int, byte>
作为参数(或 IEnumerable<KeyValuePair<int, byte>>
),枚举器本身将被装箱,因为字典类与许多集合一样,具有struct
枚举器(每次调用 foreach
时都保存对象分配)。
在上面的代码中,编译器将调用字典的GetEnumerator
方法,而不是(隐式实现的)IEnumerable<T>
方法。
不,它不会。
上述任何内容都不能装箱。您的Dictionary
已经是引用类型。KeyValuePair
是struct
.编译器生成的对 GetEnumerator()
的调用将返回一个泛型枚举器struct
..但这是在dict
上呼吁的.这已经是一个引用类型。