我们使用的第三方生成的代理将BLOB数据类型公开为字节[],然后我们通过代码生成公开该值,如下所示:
public byte[] FileRawData
{
get { return internalDataRow.FileRawData; }
set { this.internalDataRow.FileRawData = value; }
}
此属性将在整个应用程序中(可能在不同的程序集中)使用。根据FxCop规则,属性不应该暴露数组。那么,更好(或最好)的方法是什么呢?其他人在这种情况下会怎么做?
- 切换到这些类型的方法
- 更改为集合(即
ICollection<T>
或IList<T>
实现) - 关闭FxCop规则
选项3总是可能的,但如果我们应该做不同的事情,那么我更喜欢。
在这种情况下常见的问题是不变性。当byte[]被返回时,调用者可以改变它,而不需要通过setter。考虑一下如果有人这样做了会发生什么
byte[] retVal = MyInstance.FileRawData;
retVal[1] = 0x00;
可能不是你想要的,因为MyInstance内部的值已经改变了,这可能会导致问题。为了避免这种情况,你需要克隆数组,但这可能会导致长时间运行,属性不应该用于长时间运行的操作。最好的解决方法是切换到set和gets的方法,除非数组总是很小。当然,当你开始写GetFileRawData()作为方法名时,FXCop会提示你它应该是一个属性,你不能赢grin在这种情况下,只需在代码中禁用它;对于那个方法