根据 FxCop,为啥 ReadOnlyCollection<ReadOnlyCollection<T>> 不好,以及在生成不可变二维对象时有啥替代方法? [复制]

Posted

技术标签:

【中文标题】根据 FxCop,为啥 ReadOnlyCollection<ReadOnlyCollection<T>> 不好,以及在生成不可变二维对象时有啥替代方法? [复制]【英文标题】:Why is ReadOnlyCollection<ReadOnlyCollection<T>> bad according to FxCop and what is the alternative when producing an immutable 2 dimensional object? [duplicate]根据 FxCop,为什么 ReadOnlyCollection<ReadOnlyCollection<T>> 不好,以及在生成不可变二维对象时有什么替代方法? [复制] 【发布时间】:2016-10-03 17:52:36 【问题描述】:

我正在修改我的所有代码以符合 FxCop,这意味着放弃很多数组、列表以支持 ReadOnlyCollection,我同意这个建议。然而,当产生一个

ReadOnlyCollection<ReadOnlyCollection<T>> 

替换二维数组或

List<List<T>> I now get the 

CA1006: Do not nest generic types in member signatures

投诉。首先,虽然它看起来很笨拙,但它似乎并不复杂或难以理解,因为它本质上是一个不可变的List&lt;List&lt;T&gt;&gt;,考虑到数组的缺点,我认为这非常常见。 其次,我想不出另一种存储二维数据并且是不可变的替代方案,除非我专门为此创建一个新类型。

请问这里的最佳做法是什么。难道这个 FxCop 规则在这里并不适用,应该被禁止?

非常感谢。

【问题讨论】:

您的问题中非基于意见的部分已在网站 (CA1006) 上得到解答。您也可以考虑新的不可变类型作为替代 - ***.com/questions/210428/…,这将是更好的选择(因为 ReadonlyCollection 实际上不是不可变的 - ***.com/questions/32438988/…)。 您的类型的用户是否真的希望将其用作集合的集合,或者他们是否希望将其用作需要两个索引的集合?后者似乎更有可能;考虑制作您自己的集合类型,使用像这样的“嵌套”集合作为实现细节,而不是作为公共接口。 @EricLippert 用户想要一个包含两个索引的集合。数组的语法比集合的集合要简单得多,并且鉴于它不能以任何方式更改,我看不出后者的任何优点。我认为不存在这样的数组,这让我感到惊讶,因为我认为许多其他开发人员会走上与我相同的道路 a) 传递不可变数组以消除意外情况。 b) 线程安全 c) 减少变化和复杂性 d) 遵守 FxCop。我认为我最好的选择是 ImmutableList>. 【参考方案1】:

这篇文章中的 cmets 似乎也适用于这里:

该警告是一般性警告,旨在帮助您设计更好的 和更简单的公共接口。在这种情况下,您会收到关于 在你的有一个 Expression> 参数 方法。但是,对于这种方法,简化 类型,而不是您应该使用属性或 从您的规则集中完全删除该规则。

一个愚蠢的例子,你可能应该考虑遵循 规则的建议是这样的方法:

公共无效 F(Dictionary&lt;String, List&lt;Tuple&lt;&lt;String, Int32&gt;&gt;&gt; 字典);

Martin Liversage 的回答@https://***.com/a/14945331/1775528

【讨论】:

如果您认为对另一个问题的准确答案就足够了,请投票/标记以关闭为重复项。发布完整的答案(即使有归属)不是一个好习惯。 如果您认为这就是答案,请将此问题标记为重复。 @Tyler 谢谢你。 ReadOnlyCollection> 是一个常见的构造吗,因为我没有找到很多使用它的例子,但我认为当需要不变性时它会很常见。 @Pedruski 我认为这不常见...锯齿状数组更常见...T[][] 我在发布之前阅读了 Martin 的回答,但认为我的问题与 ReadOnlyCollection> 的问题不同,我仍然认为它必须是一个非常常见的签名,但我发现的很少通常在***或互联网上。我还阅读了有关新的不可变集合的信息,但认为它们没有应用,因为它们也是 ImmutableList> 会在 FxCop 中收到相同的错误。感谢您的输入。我了解您是否希望将此标记为重复。

以上是关于根据 FxCop,为啥 ReadOnlyCollection<ReadOnlyCollection<T>> 不好,以及在生成不可变二维对象时有啥替代方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

FxCop - CA1034 错误 - 为啥?

为啥我会收到来自 FxCop 的 InitializeReferenceTypeStaticFieldsInline 警告?

为啥 FxCop 给我一个“DoNotCastUnnecessarily”警告?

为啥 FxCop 坚持使用 IDisposable 作为结构

为啥 FxCop 将 GC.KeepAlive() 标记为违规?

FxCop 自定义规则文档。为啥找不到我的网址?