访问时进行阵列克隆

本文关键字:阵列 访问 | 更新日期: 2023-09-27 17:58:18

我正在读取XNA库代码,在类型VertexPositionColor中,他们压制了带有理由的CA2105:ArrayFieldsShouldNotBeReadOnly消息:"每次使用阵列时克隆阵列的性能成本太高。"

public struct VertexPositionColor
{
    public static readonly VertexElement [ ] VertexElements;
}

但为什么在使用时会被复制呢?这种情况只发生在访问的属性/字段是ValueType的结构中,对吧?

访问时进行阵列克隆

我想他们是在证明他们公开array field比其他任何东西都多的事实,他们这样做的根本原因是性能:

他们可能想到的替代方案是将array field设为私有,property暴露IEnumerable,或者每次访问property时返回array的副本。

编辑。对答案进行了一点编辑,使我想说的更清楚:p。

在大多数情况下,他们最好使用Array.AsReadOnly并返回通用ReadOnlyCollection。根据文件,这是一个O(1)操作。

在当前实现中,调用方可以更改数组中的值(直接修改静态/全局状态)。

阅读框架设计指南的另一个原因是,它为您提供了FxCop建议背后的原因。