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