【发布时间】:2011-01-06 12:10:22
【问题描述】:
我的代码中到处都是集合——我想这不是什么不寻常的事情。然而,各种集合类型的使用并不明显也不是微不足道的。一般来说,我喜欢使用公开“最佳”API 并且语法噪音最小的类型。 (有关可比较的问题,请参阅Best practice when returning an array of values、Using list arrays - Best practices)。有一些指南建议在 API 中使用哪些类型,但这些在普通(非 API)代码中是不切实际的。
例如:
new ReadOnlyCollection<Tuple<string,int>>(
new List<Tuple<string,int>> {
Tuple.Create("abc",3),
Tuple.Create("def",37)
}
)
List's 是一种非常常见的数据结构,但以这种方式创建它们会产生相当多的语法噪音 - 而且它很容易变得更糟(例如字典)。事实证明,许多列表从未更改,或者至少从未扩展。当然ReadOnlyCollection 引入了更多的语法噪音,它甚至没有完全传达我的意思;毕竟ReadOnlyCollection 可以包装一个 mutating 集合。有时我在内部使用一个数组并返回一个IEnumerable 来表示意图。但是这些方法中的大多数都具有非常低的信噪比;这对于理解代码绝对至关重要。
对于所有 不是公共 API 的代码,没有必要遵循框架指南:但是,我仍然想要一个可理解的代码和一个类型传达意图。
那么,处理制作小型集合以传递值的沼泽标准任务的最佳实践方法是什么? 是否应该尽可能首选数组而不是 List?完全不同的东西?传递如此小的集合的最佳方式是什么——干净、可读、相当有效?特别是,对于未来的维护者,代码应该是显而易见的 并且不想阅读大量 API 文档但仍了解其意图是什么。 尽量减少代码混乱也很重要 - 所以像ReadOnlyCollection 这样的东西充其量是可疑的。对于具有小表面的主要 API 来说,冗长的类型没有错,但在大型代码库中却不是一般做法。
在没有大量代码混乱(例如显式类型参数)的情况下传递值列表但仍能清楚地传达意图的最佳方式是什么?
编辑:澄清说这是为了编写简短、清晰的代码,而不是关于公共 API。
【问题讨论】:
-
所以,我实际上得到了an open source library,其中包括一个
IArray<T>接口,我认为该接口非常适合此目的。有关更多信息,请参阅我的更新答案。
标签: c# .net generics immutability