.net 枚举位数组是否会导致大量装箱/取消装箱?

.net 枚举位数组是否会导致大量装箱/取消装箱?,.net,performance,ienumerable,bitarray,.net,Performance,Ienumerable,Bitarray,System.BitArray仅实现非泛型IEnumerable,它返回IEnumerator.Current属性的对象。是否在位数组上运行foreach-例如 foreach (bool b in bitArray) { // ... } 装箱并取消装箱每个位值 查看reflector中的bitarray枚举器,它似乎在每次调用MoveNext()时都会执行一个新的位掩码,而不是更聪明的操作。是否有更有效的方法枚举具有相同存储特性的位数组,或替代位数组?(列表etc每个布尔使用一个字

System.BitArray仅实现非泛型IEnumerable,它返回IEnumerator.Current属性的对象。是否在位数组上运行foreach-例如

foreach (bool b in bitArray)
{
    // ...
}
装箱并取消装箱每个位值


查看reflector中的bitarray枚举器,它似乎在每次调用MoveNext()时都会执行一个新的位掩码,而不是更聪明的操作。是否有更有效的方法枚举具有相同存储特性的位数组,或替代位数组?(列表etc每个布尔使用一个字节,而不是一个位,因此使用8倍的空间)

是的,它会导致大量装箱。然而,在大多数情况下,我并不认为这会严重影响性能。这很烦人,但我怀疑许多真实世界的应用程序会花费大量时间装箱/拆箱(或者事后清理箱子,这当然是另一项成本)。在你努力避免它之前,也许值得检查一下

不过,您可以很容易地在上面编写自己的迭代器。。。特别是如果你不在乎在“版本”改变时破坏。例如:

public static IEnumerable<bool> EnumerateBitArray(BitArray bitArray)
{
    for (int i=0; i < bitArray.Length; i++)
    {
        yield return bitArray[i];
    }
}
公共静态IEnumerable枚举位数组(位数组位数组)
{
for(int i=0;i
如果在迭代过程中确实更改了数组,那么几乎肯定会发生不好的事情,特别是如果更改了长度