6

换句话说,是否正确使用:

public class CustomerList : System.Collections.Generic.List<Customer>
{
    /// supposed to be empty
}

代替:

using CustomerList = System.Collections.Generic.List<Customer>

我宁愿使用第一种方法,因为我只定义了一次 CustomerList,每次我需要一个客户列表时,我总是使用相同的类型。另一方面,使用名称别名方法不仅迫使我不得不在任何地方重新定义它,而且每次有人想要使用它时都可以给一个不同的别名(想想一个大团队),从而导致代码可读性差。

请注意,这种情况下的意图绝不是扩展类,而只是创建一个别名。

4

9 回答 9

12

好吧,除非您向基类添加一些功能,否则创建包装器对象是没有意义的。如果你真的需要,我会选择第二个,但为什么不直接创建一个变量呢?

List<Customer> customerList = new List<Customer>();
于 2008-09-29T00:17:47.167 回答
7

不要这样做。当人们阅读:

List<Customer> 

他们立刻明白了。当他们读到:

CustomerList

他们必须去弄清楚 CustomerList 是什么,这会使您的代码更难阅读。除非你是唯一一个在你的代码库上工作的人,否则编写可读的代码是个好主意。

于 2008-09-29T06:09:13.420 回答
4

我同意以这种方式使用别名。您的团队中的任何人都不应该以所呈现的方式使用别名;这不是提供别名的原因。此外,从泛型的工作方式来看,无论您在多少地方使用它,都只有一个 List 类。

除了声明和使用 之外List<Customer>,您最终还希望将该列表传递给其他东西。避免传递具体内容List<Customer>,而是传递一个IList<Customer>or ICollection<Customer>,因为这将使这些方法更具弹性并且更容易编程。

将来的某一天,如果你真的需要一个 CustomerList 集合类,你可以在它上面实现ICollection<Customer>orIList<Customer>并继续将它传递给那些方法,而不用改变它们甚至不知道更好。

于 2008-09-29T08:58:14.700 回答
3

其实你也不应该使用。根据框架设计指南,正确的方法是在公共 API 中使用或继承 System.Collections.ObjectModel.Collection<T>(List<T> 只能用于内部实现)。

但是关于命名的具体问题,建议似乎是直接使用泛型类型名称而不使用别名,除非您需要向集合添加功能:

务必从对象模型返回 Collection<T> 以提供标准的普通香草集合 API。

请务必从对象模型返回 Collection<T> 的子类以提供高级集合 API。

于 2008-09-29T01:01:34.427 回答
3

使用继承来做别名/类型定义的问题是需要你重新定义相关的构造函数。

由于在任何地方都这样做很快就会变得不合理,为了保持一致性,最好避免这样做。

于 2013-07-30T20:11:48.930 回答
1

这是那些“视情况而定”的问题之一。

如果您需要的是一个新类,除了您的其他要求之外,它还充当客户列表,那么继承就是方法。

如果您只想使用客户列表,请使用该变量。

于 2008-09-29T00:20:10.530 回答
1

如果您只是想节省打字,请使用后者。这样你就不会遇到任何奇怪的继承问题。

如果你真的想公开一个逻辑上不同的集合类型,那么使用前者 - 你可以回去然后向它添加东西。

就个人而言,我会使用List<Customer>并收工。

于 2008-09-29T00:22:46.703 回答
1

我基本上同意埃德的观点。如果您不需要实际扩展泛型 List 构造的功能,只需使用泛型 List:

List<Customer> customerList = new List<Customer>();

如果您确实需要扩展功能,那么通常您会考虑继承。

第三种可能性是您需要从通用列表构造中显着更改功能,在这种情况下,您可能希望简单地从 IEnumerable 继承。这样做可以使类在可枚举操作(例如“foreach”)中可用,但允许您完全定义所有类行为。

于 2008-09-29T00:23:25.173 回答
1

一个程序员在打字上的节省很可能是下一个程序员的维护噩梦。我想说只是正确地输入泛型,正如这里很多人所说的那样。它更清晰、更准确地描述了您的代码意图,并且有助于维护程序员。(谁可能是你,六个月和四个新项目!)

于 2008-09-29T00:46:55.023 回答