更好地理解C#泛型

26 c# generics

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

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

Raz*_*zie 53

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

如果你不能使用泛型怎么办?你可以使用这个ArrayList类,但缺点是它包含的类型是object.因此,当您遍历列表时,您必须将每个项目强制转换为正确的类型(string或者Animal),这是更多代码并且性能下降.另外,由于ArrayList保持对象,因此它不是类型安全的.你仍然可以添加AnimalArrayList字符串:

ArrayList arrayList = new ArrayList();
arrayList.Add(new Animal());
arrayList.Add("");
Run Code Online (Sandbox Code Playgroud)

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

foreach (object o in arrayList)
{
  if(o is Animal)
    ((Animal)o).Speak();
}
Run Code Online (Sandbox Code Playgroud)

使用泛型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
Run Code Online (Sandbox Code Playgroud)

  • 好答案.易于遵循. (3认同)
  • +1 能够给出一个漂亮、干净和不复杂的例子。做得好。 (2认同)
  • 现在这就是我们所说的基本解释,有很棒的例子,有实时代码片段。伟大的。+1 (2认同)

Jay*_*Jay 5

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

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.
Run Code Online (Sandbox Code Playgroud)

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

//  continued for snippet above
Order anotherOrder = new Order();
customers.Add(anotherOrder);    //  FAIL!
Run Code Online (Sandbox Code Playgroud)

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