更好地理解C#generics

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

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

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

如果你不能使用generics怎么办? 您可以使用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 ,这根本不可能:

 List stringList = new List(); stringList.Add("Hello"); stringList.Add("Second String"); stringList.Add(new Animal()); // error! Animal cannot be cast to a string 

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

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

 // snippet List customers = new List(); Customer thisCustomer = new Customer(); customers.Add(thisCustomer); List orders = new List(); Order thatOrder = new Order(); orders.Add(thatOrder); // etc. 

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

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

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

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

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

MSIL和CLR支持generics,使其表现非常好。

你应该阅读这些关于generics的文章 –

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

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

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