在c#中使用继承而不是名称别名是否正确?

时间:2008-09-29 00:12:17

标签: c# inheritance alias typedef

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

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

而不是:

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

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

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

9 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:6)

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

List<Customer> 
他们立即明白了。当他们读到:

CustomerList

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

答案 2 :(得分:4)

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

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

将来的某一天,如果你确实需要一个CustomerList集合类,你可以在其上实现ICollection<Customer>IList<Customer>并继续将它传递给那些方法,而不会改变甚至更好地了解它们

答案 3 :(得分:3)

其实你也不应该使用它们。公共API中的correct approach according to the framework design guidelines is to either use or inherit from System.Collections.ObjectModel.Collection<T>(List&lt; T&gt;只应用于内部实现)。

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

  

返回Collection&lt; T&gt;来自对象   模型提供标准平原   香草集合API。

     

返回Collection&lt; T&gt;的子类   从对象模型提供   高级集合API。

答案 4 :(得分:3)

使用继承来执行别名/类型定义存在需要重新定义相关构造函数的问题。

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

答案 5 :(得分:1)

这是“依赖”问题之一。

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

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

答案 6 :(得分:1)

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

如果你真的想要公开一个逻辑上不同的集合类型,那么使用前者 - 你可以返回并添加内容。

就个人而言,我只会使用List<Customer>并将其称为一天。

答案 7 :(得分:1)

我基本同意Ed。如果您不需要实际扩展通用List构造的功能,只需使用通用List:

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

如果你确实需要扩展功能,那么通常你会看到继承。

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

答案 8 :(得分:1)

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