我们使用的第三方生成的代理将 BLOB 数据类型公开为 byte[],然后我们通过代码生成公开此值,如下所示:
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 中的值已更改,这可能会导致问题。因此,为了停止克隆数组,但这可能会长时间运行,并且不应将属性用于长时间运行的操作。解决它的最佳方法是切换到 sets 和 gets 方法,除非数组总是很小。当然,当您开始将 GetFileRawData() 编写为方法名称时,FXCop 会提示您它应该是一个属性,您无法赢得 grin 在这种情况下,只需在代码中禁用它即可;对于那个方法。
关于c# - 传递一个 byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7375551/