【问题标题】:Array cloning on access?阵列克隆访问?
【发布时间】:2011-09-08 02:53:18
【问题描述】:

我正在阅读 XNA 库代码,在 VertexPositionColor 类型中,它们以“每次使用时克隆数组的性能成本太高”为由压制了 CA2105:ArrayFieldsShouldNotBeReadOnly 消息。

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

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

【问题讨论】:

  • 嗯,它是一个游戏开发库——性能胜过严格遵循设计规则。他们还改变了这个功能的设计in XNA 4.0
  • 我知道 perf 更重要,但我不知道这如何通过访问数组来制作副本。

标签: c# .net arrays performance xna


【解决方案1】:

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

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

阅读Framework Design Guidelines 的另一个理由 - 它为您提供了 FxCop 建议背后的原因。

【讨论】:

  • 谢谢,这是个好主意。不知道那个方法,看来他们应该像你说的那样使用。
【解决方案2】:

我猜他们是在证明他们暴露arrayfield比其他任何事情都多,而他们这样做的根本原因是性能:

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

编辑。稍微编辑了答案,以使我想说的更清楚:p。

【讨论】:

  • 谢谢,但是为什么他们不能只拥有一个可以传递存储在其中的私有数组的属性呢?那会产生同样的效果,不是吗?
  • @Joan Venge:这不会提供一致的ref,这可能是一个问题,具体取决于他们正在做什么。
  • 谢谢,“一致的参考”是什么意思?你这么说是因为 static 关键字吗?
  • 属性不能为ref参数。这可能是原因。
  • 我明白了,但是如果它们是按值传递的,那么只会复制对数组的引用,对吧?不是整个数组。
猜你喜欢
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 2021-03-15
  • 2020-04-28
  • 1970-01-01
相关资源
最近更新 更多