FxCop 说我应该返回一个通用列表接口而不是字节数组。我是否该? [关闭]

Posted

技术标签:

【中文标题】FxCop 说我应该返回一个通用列表接口而不是字节数组。我是否该? [关闭]【英文标题】:FxCop says I should return a generic list inteface instead of a byte array. Should I? [closed]FxCop 说我应该返回一个通用列表接口而不是字节数组。我是不是该? [关闭] 【发布时间】:2011-10-14 21:14:51 【问题描述】:

我正在编写一个库,而不是从 EventArgs 派生中返回一个字节数组,它说我应该返回类似 IList 或 ReadOnlyCollection 的东西。

通常我会全力以赴,但大多数现有 .NET Framework 使用字节数组,而不是通用列表接口。

因此,如果我要使用 IList,那么在访问 eventargs 时,如果客户想要调用 File.WriteAllBytes,他或她将不得不执行 using System.Linq; 并调用 ToArray 扩展方法以获取 IList 的形式字节数组。当然还有其他方法可以做到这一点,但这是最优雅和典型的。

这个库的客户总是希望事物以字节数组的形式出现,以便它们与框架的其余部分很好地交互。

此外,优化可能会在这里发挥作用。有可能会操纵大量字节,因此每次都必须重新复制整个列表才能以字节数组的形式获取它,这可能会减慢速度。

最后,这简直令人不快。如果客户总是想要一个字节数组,那为什么不直接给他们呢?框架设计指南是否不适用于这种情况?你会怎么做?

【问题讨论】:

做最有意义的事。 FxCop 只是帮助您的工具。 @Chad:是的,但我不确定哪个最有意义。每个都有优点和缺点,我不确定该选择哪个。返回 List 接口使其更具可扩展性和通用性,但对客户来说可能会或可能不会很痛苦,具体取决于他们对数据的需求。此外,由于必须复制数组,它可能会变慢。 @Ryan,如果客户想要一个列表来操作数组中的数据,他们可以轻松地制作一个。 【参考方案1】:

有可能会处理大量字节,因此每次都必须重新复制整个列表才能以字节数组的形式获取它可能会减慢速度。

但这正是它应该是字节数组的原因。假设你这样做:

byte[] x1 = GetByteArray();
x1[0] = 0;
byte[] x2 = GetByteArray();

每次调用 GetByteArray 时,都必须创建一个 new 字节数组。为什么?因为可能有人将您上次分发的内容更改为不同的内容!通过分发一个字节数组,您可以保证每次都必须从头开始重建该字节数组。

相比之下,如果您分发只读的字节集合,那么您可以一遍又一遍地分发相同的集合。你知道它不会改变。

【讨论】:

【参考方案2】:

这个库的客户总是希望事情符合条件 一个字节数组,以便它们与其余部分很好地交互 框架。

你有你的答案 - FxCop 输出在大多数情况下只是有用的建议 - 不是命令 - 如果这个特定的一个不适用于你,你甚至可以将其关闭。

【讨论】:

关闭有用的建议就像忽略安全带灯,当您开始开车时没有系好安全带。【参考方案3】:

FxCop 提供的指南和建议并不总是适用于所有情况。您不需要关注它们,在某些情况下也不应该这样做。

【讨论】:

以上是关于FxCop 说我应该返回一个通用列表接口而不是字节数组。我是否该? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

FXCop 规则接口方法应该可以被子类型调用

CSV 应该返回字符串,而不是字节错误

如何解决“迭代器应该返回字符串,而不是字节”

csv.Error:迭代器应该返回字符串,而不是字节

为啥 InputStream#read() 返回一个 int 而不是一个字节?

Python-redis keys()返回字节对象列表,而不是字符串解决办法