c# - 传递一个 byte[]

标签 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 规则。

选项 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/

相关文章:

c# - FileSavePicker 任务未显示在 wp8 c# 的 Window.Storage.Pickers 中

java - 我可以将列表中的每个元素分配给单独的变量吗?

java - 当我们尝试将不相等的对象插入到 HashSet 中时,如何解决由于相同的 hashcode 值而导致的冲突?

msbuild - 您可以从msbuild.exe命令行关闭条件编译符号吗?

c# - 抑制或避免警告 CA2214

c# - WPF:如何更改 TransitioningContentControl 背景颜色?

c# - 为 Orchard CMS 构建一个简单的交互式 FizzBu​​zz 模块?

c# - 将 SQL Server 数据库添加到 Visual Studio 2013 ASP.Net 网页

c# - 为什么核心类型只实现了部分接口(interface)?

c# - CodeContract 是否类似于 FxCop?