C# 传递一个字节[]
我们使用的第三方生成的代理将BLOB数据类型公开为字节[],然后我们通过如下代码生成来公开此值:C# 传递一个字节[],c#,collections,fxcop,C#,Collections,Fxcop,我们使用的第三方生成的代理将BLOB数据类型公开为字节[],然后我们通过如下代码生成来公开此值: public byte[] FileRawData { get { return internalDataRow.FileRawData; } set { this.internalDataRow.FileRawData = value; } } 然后在整个应用程序中使用此属性(可能在不同的程序集中)。根据FxCop规则,属性不应该公开数组。那么,这里更好(或最好)的方法是什么?在
public byte[] FileRawData
{
get { return internalDataRow.FileRawData; }
set { this.internalDataRow.FileRawData = value; }
}
然后在整个应用程序中使用此属性(可能在不同的程序集中)。根据FxCop规则,属性不应该公开数组。那么,这里更好(或最好)的方法是什么?在这种情况下,其他人会怎么做
ICollection
或IList
实现)选项3总是可能的,但如果我们应该以不同的方式做事,那么我更愿意这样做。这种情况下的常见问题是不可更改性。当返回字节[]时,调用方可以更改它,而无需通过setter。想想如果某人做了< /P>会发生什么?
byte[] retVal = MyInstance.FileRawData;
retVal[1] = 0x00;
可能根本不是您想要的,因为MyInstance中的值已更改,这可能会导致问题。因此,为了停止克隆阵列,但这可能会导致长时间运行,并且属性不应用于长时间运行的操作。解决这个问题的最佳方法是切换到set和get的方法,除非数组总是很小。当然,当您开始将GetFileRawData()作为方法名FXCop编写时,会提示您它应该是一个属性,在这种情况下,您无法赢得grin,只需在代码中禁用它;对于这一种方法。不,fxcop实际上是在警告您其他事情。返回数组的深度副本效率非常低。它不够聪明,无法看到您真正在做什么,返回一个引用。更糟糕的是,任何客户端代码都可以在您不知道的情况下更改阵列。您最好将该类设置为内部。访问该属性的代码是否有任何理由不应修改数组?Hans:将其设置为内部不是一个选项,因为这发生在公共程序集中,系统的其他部分可以访问该程序集。我应该返回一个
ReadOnlyCollection
或类似内容,这样的想法对吗?internalDataRow
的实现也只是将一个引用传回其数组,因此除了此之外,返回任何东西都不会有效率吗?@Daniel:是的,如果API的客户端不修改数组,只读集合
将是理想的选择。但是如果我将数组作为列表
或集合
公开,会出现同样的问题,不是吗?调用方可以执行myInstance.FileRawData.Delete(index)
?唯一的解决方法是公开一个只读集合
。因此,如果您要返回从字节数组创建的列表或集合,而不是在内部用列表替换字节,您会感觉很好(但只读更有意义)