传递字节[]



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

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

此属性将在整个应用程序中(可能在不同的程序集中)使用。根据FxCop规则,属性不应该暴露数组。那么,更好(或最好)的方法是什么呢?其他人在这种情况下会怎么做?

  1. 切换到这些类型的方法
  2. 更改为集合(即ICollection<T>IList<T>实现)
  3. 关闭FxCop规则

选项3总是可能的,但如果我们应该做不同的事情,那么我更喜欢。

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

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

可能不是你想要的,因为MyInstance内部的值已经改变了,这可能会导致问题。为了避免这种情况,你需要克隆数组,但这可能会导致长时间运行,属性不应该用于长时间运行的操作。最好的解决方法是切换到set和gets的方法,除非数组总是很小。当然,当你开始写GetFileRawData()作为方法名时,FXCop会提示你它应该是一个属性,你不能赢grin在这种情况下,只需在代码中禁用它;对于那个方法

相关内容

  • 没有找到相关文章

最新更新