更好地理解C#泛型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更好地理解C#泛型相关的知识,希望对你有一定的参考价值。

我使用C#泛型查看了一些示例代码。为什么以及何时应该使用它们?

所有的例子都很复杂。我需要一个简单明了的例子,让我开始使用C#泛型。

答案

一个非常简单的例子是通用的List<T>类。它可以容纳任何类型的许多对象。例如,您可以声明字符串列表(new List<string>())或动物列表(new List<Animal>()),因为它是通用的。

如果你不能使用泛型怎么办?你可以使用ArrayList类,但缺点是它包含的类型是object。因此,当您遍历列表时,您必须将每个项目转换为正确的类型(stringAnimal),这是更多的代码并且具有性能损失。另外,由于ArrayList持有物体,因此它不是类型安全的。您仍然可以将Animal添加到字符串的ArrayList中:

ArrayList arrayList = new ArrayList();
arrayList.Add(new Animal());
arrayList.Add("");

因此,在迭代ArrayList时,您必须检查类型以确保实例是特定类型,这会导致代码不佳:

foreach (object o in arrayList)
{
  if(o is Animal)
    ((Animal)o).Speak();
}

使用通用的List<string>,这根本不可能:

List<string> stringList = new List<String>();
stringList.Add("Hello");
stringList.Add("Second String");
stringList.Add(new Animal()); // error! Animal cannot be cast to a string
另一答案

总结一些重点的其他答案:

1)泛型使您能够编写“通用”代码(即,它将适用于多种类型)。如果您要编写“通用”行为(需要针对不同的数据类型执行操作),则只需编写一次该代码即可。 List的例子是一个很好的例子,您可能需要客户,产品,订单,供应商的列表......所有这些都使用为每种类型实例化的相同代码

//  snippet
List<Customer> customers = new List<Customer>();
Customer thisCustomer = new Customer();
customers.Add(thisCustomer);

List<Order> orders = new List<Order>();
Order thatOrder = new Order();
orders.Add(thatOrder);

//  etc.

2)令人惊讶的是,仿制药仍然可以实现类型安全!因此,如果您尝试这样做,您将收到错误:

//  continued for snippet above
Order anotherOrder = new Order();
customers.Add(anotherOrder);    //  FAIL!

并且您希望这是一个错误,以便稍后您的客户处理代码不必处理显示在客户列表中的虚假订单。

另一答案

复制是万恶之源。当您必须对不同类型的数据执行相同的操作时,会发生一例代码重复。通用允许您围绕“通用”类型进行编码,然后将其替换为特定类型,从而避免使用泛型。

此问题的另一个解决方案是使用“System.Object”类型的变量,可以为其分配任何类型的对象。此方法涉及打击性能的值和引用类型之间的装箱和取消装箱操作。类型转换也可以防止代码干净。

MSIL和CLR支持泛型,使其表现非常出色。

你应该阅读这些关于泛型的文章 -

http://msdn.microsoft.com/en-us/library/512aeb7t(VS.80).aspx

http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx#csharp_generics_topic1

另一答案

简而言之,泛型允许您编写适用于任何类型对象的类,但无需将数据转换为Object。这有一些性能优势,但它也使您的代码更具可读性,可维护性,并且不易出错。

在可能的情况下,您应该始终使用泛型而不是.NET 1.1样式类。

以上是关于更好地理解C#泛型的主要内容,如果未能解决你的问题,请参考以下文章

更好地理解外部“C”函数

操作 Java 泛型:泛型在继承方面体现与通配符使用

Java:泛型类型使用总结

这个嵌套类构造函数片段可以应用于泛型类吗?

如何有条件地将 C 代码片段编译到我的 Perl 模块?

如何更好地理解如何阅读 Flutter 代码? [关闭]