传递一个byte []

时间:2011-09-11 00:28:39

标签: c# collections fxcop

我们使用的第三方生成的代理将BLOB数据类型公开为byte [],然后我们通过代码生成公开此值,如下所示:

public byte[] FileRawData
{
    get { return internalDataRow.FileRawData; }
    set { this.internalDataRow.FileRawData = value; }
}

然后通过我们的应用程序使用此属性(可能在不同的程序集中)。根据FxCop规则,属性不应该暴露数组。那么,这里更好(或最好)的方法是什么?其他人在这种情况下做了什么?

  1. 切换到这些类型的方法。
  2. 更改为集合(即ICollection<T>IList<T>实施)
  3. 关闭此FxCop规则。
  4. 选项3总是可行的,但如果我们应该以不同的方式做事,那么我宁愿这样做。

1 个答案:

答案 0 :(得分:2)

在这种情况下,通常的问题是不变性。当返回byte []时,调用者可以更改它,而无需通过你的setter。考虑如果有人做了会发生什么

byte[] retVal = MyInstance.FileRawData;
retVal[1] = 0x00;

可能根本不是你想要的,因为MyInstance中的值已经改变,这可能会导致问题。因此,为了阻止您克隆数组,但这可能会长时间运行,并且不应将属性用于长时间运行的操作。解决它的最佳方法是切换到集合和获取的方法,除非数组总是很小。当然,当你开始编写GetFileRawData()作为方法名称时,FXCop会提示你它应该是一个属性,你不能赢得 grin 在这种情况下只需在代码中禁用它;对于那种方法。