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; }

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

不,上面的代码不装箱。

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

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

不,它不会。

上述任何内容都不能装箱。您的Dictionary已经是引用类型。KeyValuePairstruct.编译器生成的对 GetEnumerator() 的调用将返回一个泛型枚举器struct ..但这是在dict上呼吁的.这已经是一个引用类型。