【问题标题】:Understanding C# generics much better更好地理解 C# 泛型
【发布时间】:2011-04-06 02:47:22
【问题描述】:

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

所有的例子都很复杂。我需要一个简单、清晰的示例来帮助我开始使用 C# 泛型。

【问题讨论】:

标签: c# generics


【解决方案1】:

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

如果你不能使用泛型怎么办?您可以使用ArrayList 类,但缺点是它的包含类型是object。因此,当您遍历列表时,您必须将每个项目转换为正确的类型(string 或 Animal),这需要更多代码并且会降低性能。另外,由于 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 因为能够给出一个漂亮、干净且不复杂的示例。干得好。
  • 现在这就是我们所说的基本解释,有很棒的例子,有实时代码sn-p。伟大的。 +1
  • 实际上在语法上迭代 Arraylist/List 没有区别。实际上,您用于迭代数组列表的代码不会编译。区别在于语义,有一个cast introduced for you by the foreach statement。
  • 你是对的@SriramSakthivel,语法不正确。更新了我的答案
【解决方案2】:

简而言之,泛型允许您编写可处理任何类型对象的类,但不必将数据转换为Object。这样做有性能优势,但它也使您的代码更具可读性、可维护性和更不容易出错。

如果可能,您应该始终使用泛型而不是 .NET 1.1 样式类。

【讨论】:

    【解决方案3】:

    总结其他答案并强调:

    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!
    

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

    【讨论】:

    • 我希望我能说出 Unmesh 所说的:“复制是万恶之源。”
    【解决方案4】:

    复制是万恶之源。当您必须对不同类型的数据执行相同的操作时,就会发生代码重复的一种情况。泛型允许您围绕“泛型”类型编写代码,然后用特定类型替换它,从而避免这种情况。

    此问题的另一个解决方案是使用“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

    【讨论】:

    • 万恶之源有很多,比如过早的优化,甚至是过早的泛化;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 2021-07-03
    相关资源
    最近更新 更多