2012-10-23 40 views
1

我不知道为什么代码分析(在VS 2012)发出返回一个数组的“CA1819:属性不应返回数组”,为下面的代码:替代从一个属性的getter

private byte[] BackingFieldData; 

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

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

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

候补委员,我认为是IEnumerable<byte>IList<byte>(索引使用SkipTake等非常完成)(侧重于添加和删除元素 - 我不希望出现这种情况),并ReadOnlyCollection<byte>(我讨厌类公开方法总是扔NotSupportedException s,远离良好的编码风格恕我直言)。我还想过在数组周围创建一个包装类的自定义接口 - 但是,这有什么意义呢(除了我可以在不压制它的情况下摆脱这个警告)。

因此,没有人知道一个良好的类型返回数组类型或一个很好的理由不要在这种情况下返回数组呢?我到目前为止没有提到什么影响?

回答

5

在这种情况下,应该抑制警告。
大多数阵列准则并不适用于byte[]秒。

不过,你也应该删除(或private IZE)的制定者。

+0

+1对于'私有化':D(因为如果不允许他们改变长度,这是一个好点)。 – Rawling

+0

+1 public setter是一个错误,我总是看到任何集合类型。 –

+0

对不起,5行代码已经是bug了;-)。在我的实施中根本没有二传手。只有在演示代码中;我想看看是否也有警告,如果有setter可用... – Korexio

0

.NET框架4.5提供了IReadOnlyList<T> Interface

阵列可分配给一个IReadOnlyList<T>无需转换等 - IMHO的最佳解决方案。

+0

我不明白。这是一个解决方案?在这个问题中,你说“用户应该可以修改阵列”。但是这不能通过IReadOnlyList接口完成。 – Henrik

+0

@亨利克:你完全正确;我已经开始使用'IReadOnlyList '摆脱的情况下,警告如果用户并不需要修改的内容。我还没有找到解决我最初的问题。 – Korexio