C# 泛型是一种强大的编程工具,它允许我们编写可以适用于多种数据类型的代码。在 C# 中,泛型可以用于类、接口、方法和委托。

优点

泛型的优点有很多,以下是其中的几个:

  1. 类型安全:泛型可以在编译时检查类型,从而避免了在运行时出现类型错误的情况。这可以提高代码的可靠性和可维护性。
  2. 代码重用:泛型可以让我们编写可以适用于多种数据类型的代码,从而避免了重复编写类似的代码的情况。这可以提高代码的复用性和可维护性。
  3. 性能优化:泛型可以在编译时生成特定类型的代码,从而避免了在运行时进行类型转换的情况。这可以提高代码的性能。
  4. 可读性:泛型可以让代码更加简洁和易读,从而提高了代码的可读性和可维护性。

泛型类

泛型类是一种可以适用于多种数据类型的类。在定义泛型类时,我们使用尖括号 <T>

public class MyGenericClass<T>
{
    private T myGenericMember;
 
    public MyGenericClass(T value)
    {
        myGenericMember = value;
    }
 
    public T GenericMethod(T genericParameter)
    {
        Console.WriteLine("Parameter type: {0}, value: {1}", typeof(T).ToString(), genericParameter);
        Console.WriteLine("Return type: {0}, value: {1}", typeof(T).ToString(), myGenericMember); 
        return myGenericMember;
    }
}

在上面的示例中,我们定义了一个名为 MyGenericClass 的泛型类,它有一个类型参数 T。

我们还定义了一个名为 GenericMethod 的泛型方法,它接受一个类型为 T 的参数,并返回一个类型为 T

泛型接口

泛型接口是一种可以适用于多种数据类型的接口。在定义泛型接口时,我们使用尖括号 <T>

public interface IMyGenericInterface<T>
{
    T GenericMethod(T genericParameter);
}

在上面的示例中,我们定义了一个名为 IMyGenericInterface 的泛型接口,它有一个类型参数 T。

我们还定义了一个名为 GenericMethod 的泛型方法,它接受一个类型为 T 的参数,并返回一个类型为 T

泛型方法

泛型方法是一种可以适用于多种数据类型的方法。在定义泛型方法时,我们使用尖括号 <T> 来表示类型参数。例如,下面是一个简单的泛型方法示例:

public static void Swap<T>(ref T a, ref T b)
{
    T temp = a;
    a = b;
    b = temp;
}

在上面的示例中,我们定义了一个名为 Swap 的泛型方法,它有一个类型参数 T。该方法接受两个引用类型的参数 a 和 b,并交换它们的值。

泛型约束

泛型约束是一种可以限制泛型类型参数的类型的方法。在定义泛型类型参数时,我们可以使用 where 关键字来指定泛型类型参数必须满足的条件。例如,下面是一个简单的泛型方法示例,它使用了泛型约束:

public static T Max<T>(T a, T b) where T : IComparable<T>
{
    if (a.CompareTo(b) > 0)
    {
        return a;
    }
    else
    {
        return b;
    }
}

在上面的示例中,我们定义了一个名为 Max 的泛型方法,它有一个类型参数 T。

该方法接受两个类型为 T 的参数 a 和 b,并返回它们中的最大值。我们使用了泛型约束 where T : IComparable<T> 来限制泛型类型参数必须实现 IComparable<T> 接口,以便我们可以使用 CompareTo 方法来比较两个值的大小。