根据 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<List<T>>
,考虑到数组的缺点,我认为这非常常见。
其次,我想不出另一种存储二维数据并且是不可变的替代方案,除非我专门为此创建一个新类型。
请问这里的最佳做法是什么。难道这个 FxCop 规则在这里并不适用,应该被禁止?
非常感谢。
【问题讨论】:
您的问题中非基于意见的部分已在网站 (CA1006) 上得到解答。您也可以考虑新的不可变类型作为替代 - ***.com/questions/210428/…,这将是更好的选择(因为 ReadonlyCollection 实际上不是不可变的 - ***.com/questions/32438988/…)。 您的类型的用户是否真的希望将其用作集合的集合,或者他们是否希望将其用作需要两个索引的集合?后者似乎更有可能;考虑制作您自己的集合类型,使用像这样的“嵌套”集合作为实现细节,而不是作为公共接口。 @EricLippert 用户想要一个包含两个索引的集合。数组的语法比集合的集合要简单得多,并且鉴于它不能以任何方式更改,我看不出后者的任何优点。我认为不存在这样的数组,这让我感到惊讶,因为我认为许多其他开发人员会走上与我相同的道路 a) 传递不可变数组以消除意外情况。 b) 线程安全 c) 减少变化和复杂性 d) 遵守 FxCop。我认为我最好的选择是 ImmutableList这篇文章中的 cmets 似乎也适用于这里:
该警告是一般性警告,旨在帮助您设计更好的 和更简单的公共接口。在这种情况下,您会收到关于 在你的有一个 Expression> 参数 方法。但是,对于这种方法,简化 类型,而不是您应该使用属性或 从您的规则集中完全删除该规则。
一个愚蠢的例子,你可能应该考虑遵循 规则的建议是这样的方法:
公共无效 F(
Dictionary<String, List<Tuple<<String, Int32>>>
字典);
Martin Liversage 的回答@https://***.com/a/14945331/1775528
【讨论】:
如果您认为对另一个问题的准确答案就足够了,请投票/标记以关闭为重复项。发布完整的答案(即使有归属)不是一个好习惯。 如果您认为这就是答案,请将此问题标记为重复。 @Tyler 谢谢你。 ReadOnlyCollectionT[][]
我在发布之前阅读了 Martin 的回答,但认为我的问题与 ReadOnlyCollection以上是关于根据 FxCop,为啥 ReadOnlyCollection<ReadOnlyCollection<T>> 不好,以及在生成不可变二维对象时有啥替代方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥我会收到来自 FxCop 的 InitializeReferenceTypeStaticFieldsInline 警告?
为啥 FxCop 给我一个“DoNotCastUnnecessarily”警告?
为啥 FxCop 坚持使用 IDisposable 作为结构