我想知道为什么代码分析(在VS 2012中)为以下代码发出“CA1819:属性不应该返回数组”:
private byte[] BackingFieldData;
public byte[] Data
{
get { return this.BackingFieldData; }
set { this.BackingFieldData = value; }
}
警告状态描述属性返回的数组不受写保护,即使该属性是只读的。为了防止数组防篡改,属性必须返回数组的副本。
我想要的是返回数组。用户应该能够修改数组,但不能调整它的大小。用户经常访问阵列的大小。用户必须能够通过索引访问元素。因此,阵列类型看起来非常合适。
我考虑的替代方案是IEnumerable<byte>
(使用Skip
和Take
等方式完成索引,IList<byte>
(专注于添加和删除元素 - 我不希望那样)和ReadOnlyCollection<byte>
(我讨厌当类暴露总是抛出NotSupportedException
s的方法时,远离良好的编码风格恕我直言。我还考虑过在数组周围创建一个带有包装类的自定义接口 - 但重点是什么(除了我可以在不压制它的情况下摆脱警告)。
那么,有没有人知道要返回的好类型而不是数组类型或者为什么不在这种情况下返回数组?到目前为止我没有提到任何影响吗?
答案 0 :(得分:5)
在这种情况下,您应该禁止该警告
大多数数组指南不适用于byte[]
。
但是,您还应该删除(或private
ize)设置器。
答案 1 :(得分:0)
.NET Framework 4.5提供了IReadOnlyList<T> Interface
可以将阵列分配给IReadOnlyList<T>
而无需转换等 - 恕我直言,这是最佳解决方案。