【发布时间】:2011-09-11 00:28:39
【问题描述】:
我们使用的第三方生成代理将 BLOB 数据类型暴露为 byte[],然后我们通过代码生成暴露该值,如下所示:
public byte[] FileRawData
{
get { return internalDataRow.FileRawData; }
set { this.internalDataRow.FileRawData = value; }
}
然后在整个应用程序中使用此属性(可能在不同的程序集中)。根据 FxCop 规则,属性不应暴露数组。那么,这里有什么更好(或最好)的方法?在这种情况下,其他人会怎么做?
- 切换到这些类型的方法。
- 更改为集合(即
ICollection<T>或IList<T>实现) - 关闭此 FxCop 规则。
选项 3 始终是可能的,但如果我们应该以不同的方式做事,那么我更愿意这样做。
【问题讨论】:
-
不,fxcop 实际上是在警告您其他事情。返回数组的深拷贝 效率非常低。返回一个reference 来查看你真正在做什么是不够聪明的。更糟糕的是,任何客户端代码都可以在您不知情的情况下更改数组。你最好把这个类设为internal。
-
访问该属性的代码是否有任何理由不应修改数组?
-
Hans:将其设为内部不是一种选择,因为这发生在一个通用程序集中,我们系统的其他部分可以访问该程序集。我是否认为我应该返回
ReadOnlyCollection<T>或类似名称?internalDataRow的实现也只是传回了对其数组的引用,所以返回除此之外的任何内容都不会效率低下吗? -
@Daniel:是的,如果您的 API 的客户端不会修改数组,
ReadOnlyCollection<T>将是理想的选择。
标签: c# collections fxcop