Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 传递一个字节[]_C#_Collections_Fxcop - Fatal编程技术网

C# 传递一个字节[]

C# 传递一个字节[],c#,collections,fxcop,C#,Collections,Fxcop,我们使用的第三方生成的代理将BLOB数据类型公开为字节[],然后我们通过如下代码生成来公开此值: public byte[] FileRawData { get { return internalDataRow.FileRawData; } set { this.internalDataRow.FileRawData = value; } } 然后在整个应用程序中使用此属性(可能在不同的程序集中)。根据FxCop规则,属性不应该公开数组。那么,这里更好(或最好)的方法是什么?在

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

public byte[] FileRawData
{
    get { return internalDataRow.FileRawData; }
    set { this.internalDataRow.FileRawData = value; }
}
然后在整个应用程序中使用此属性(可能在不同的程序集中)。根据FxCop规则,属性不应该公开数组。那么,这里更好(或最好)的方法是什么?在这种情况下,其他人会怎么做

  • 切换到这些类型的方法
  • 更改为集合(即
    ICollection
    IList
    实现)
  • 关闭此FxCop规则

  • 选项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)
    ?唯一的解决方法是公开一个
    只读集合
    。因此,如果您要返回从字节数组创建的列表或集合,而不是在内部用列表替换字节,您会感觉很好(但只读更有意义)