📜  C#|泛型–简介

📅  最后修改于: 2021-05-29 20:41:00             🧑  作者: Mango

泛型是允许用户使用占位符定义类和方法的类。泛型已添加到C#语言的2.0版中。使用泛型的基本思想是允许类型(整数,字符串,…等和用户定义的类型)成为方法,类和接口的参数。集合的主要限制是缺乏有效的类型检查。这意味着您可以将任何对象放入集合中,因为C#编程语言中的所有类都从对象基类扩展而来。这损害了类型安全性,并且与C#作为类型安全语言的基本定义相矛盾。此外,使用集合会涉及大量的性能开销,这些形式的开销是隐式和显式类型转换的形式,这是从集合添加或检索对象所必需的。
为了解决类型安全问题, .NET框架提供了泛型来创建类,结构,接口和方法,这些类,结构,接口和方法为其使用的类型具有占位符。泛型通常用于为引用和值类型创建类型安全的集合。 .NET框架在System.Collections.Generic命名空间中提供了一组广泛的接口和类,用于实现通用集合。

通用类

C#中的泛型是它最强大的功能。它允许您定义类型安全的数据结构。结果是显着的性能提升和高级代码,因为它有助于重用数据处理算法,而无需复制特定于类型的代码。泛型类似于C++中的模板,但实现和功能不同。泛型引入了类型参数的概念,因此可以创建推迟数据类型框架的方法和类,直到该类或方法被声明并由客户端代码实例化为止。泛型类型比常规系统类型具有更好的性能,因为它们减少了装箱,拆箱和类型转换变量或对象的需求。
参数类型是在通用类创建中指定的。

要创建通用类的对象,请使用以下语法:

BaseType  obj = new BaseType ()

例子:

// C# program to show working of 
// user defined Generic classes
using System;
  
// We use < > to specify Parameter type
public class GFG {
      
    // private data members
    private T data;
      
    // using properties
    public T value
    {
          
        // using accessors
        get
        {
            return this.data;
        }
        set
        {
            this.data = value;
        }
    }
}
  
// Driver class
class Test {
      
    // Main method
    static void Main(string[] args)
    {
          
        // instance of string type
        GFG name = new GFG();
        name.value = "GeeksforGeeks";
          
        // instance of float type
        GFG version = new GFG();
        version.value = 5.0F;
          
        // display GeeksforGeeks
        Console.WriteLine(name.value); 
          
        // display 5
        Console.WriteLine(version.value); 
    }
}

输出 :

GeeksforGeeks
5

说明:前面的示例定义了一个通用类GFG ,它使用通用类型参数’T’。在Main()方法中,通过将’T’替换为’ 字符串’和’float’数据类型,创建了GFG的两个实例。这些对象分别用于存储’ 字符串’和’float’值。 GFG类通过在其构造函数中接受所需的类型来确保类型安全。

具有各种参数的泛型方法:正如方法可以采用一个参数一样,泛型也可以采用各种参数。可以将一个参数作为熟悉的类型传递,将另一个作为泛型类型传递,如下所示:

  • 例子:
    // C# program to show multiple
    // type parameters in Generics
    using System;
      
    public class GFG {
          
        // Generics method
        public void Display(string msg, TypeOfValue value)
        {
            Console.WriteLine("{0}:{1}", msg, value);
        }
    }
      
    // Driver class
    public class Example {
          
        // Main Method
        public static int Main()
        {
              
            // creating object of class GFG
            GFG p = new GFG();
              
            // calling Generics method
            p.Display("Integer", 122);
            p.Display("Character", 'H');
            p.Display("Decimal", 255.67);
            return 0;
        }
    }
    

    输出 :

    Integer:122
    Character:H
    Decimal:255.67
    

泛型的特征

泛型是一种通过多种方式改进程序的技术,例如:

  • 它可以帮助您进行代码重用,性能和类型安全。
  • 您可以创建自己的通用类,方法,接口和委托。
  • 您可以创建通用集合类。 .NET框架类库在System.Collections.Generic命名空间中包含许多新的通用集合类。
  • 您可以在运行时获取有关通用数据类型中使用的类型的信息。

泛型的优势

  • 可重用性:您可以在同一代码中为多个目的使用单个泛型类型定义,而无需进行任何更改。例如,您可以创建一个通用方法来添加两个数字。此方法可用于添加两个整数以及两个浮点数,而无需在代码中进行任何修改。
  • 类型安全性:通用数据类型可提供更好的类型安全性,尤其是在集合的情况下。使用泛型时,您需要定义要传递给集合的对象的类型。这有助于编译器确保仅将定义中定义的那些对象类型传递给集合。
  • 性能:与普通系统类型相比,泛型类型提供了更好的性能,因为它们减少了对变量或对象进行装箱,拆箱和类型转换的需要。