1

我想知道为什么代码分析(在 VS 2012 中)会为以下代码发出“CA1819:属性不应返回数组”:

private byte[] BackingFieldData;

public byte[] Data
{
    get { return this.BackingFieldData; }
    set { this.BackingFieldData = value; }
}

警告状态的描述属性返回的数组不受写保护,即使该属性是只读的。为了保持数组防篡改,该属性必须返回数组的副本。

我想要的是返回数组。用户应该能够修改数组,但不能调整它的大小。用户经常访问数组的大小。用户必须能够通过索引访问元素。因此,数组类型似乎非常适合。

我考虑过的替代方案是(使用等IEnumerable<byte>非常好地完成索引),(它专注于添加和删除元素 - 我不想要那个)和(当类公开总是抛出 s 的方法时,我讨厌它,远离良好的编码风格恕我直言)。我还考虑过在数组周围创建一个带有包装类的自定义接口——但这有什么意义(除了我可以在不抑制警告的情况下摆脱警告)。SkipTakeIList<byte>ReadOnlyCollection<byte>NotSupportedException

那么,有没有人知道要返回的好类型而不是数组类型,或者在这种情况下为什么不返回数组的充分理由?到目前为止我没有提到任何影响吗?

4

2 回答 2

5

在这种情况下,您应该禁止显示该警告。
大多数数组指南不适用于byte[]s。

但是,您还应该删除(或private调整)setter。

于 2012-10-23T14:15:37.757 回答
0

.NET Framework 4.5 提供IReadOnlyList<T> 接口

数组可以分配给一个IReadOnlyList<T>没有转换等 - 恕我直言,最好的解决方案。

于 2013-04-17T10:15:21.460 回答