📜  C#|泛型–简介(1)

📅  最后修改于: 2023-12-03 15:14:29.840000             🧑  作者: Mango

C# | 泛型 – 简介

C# 泛型是一种参数化类型,它支持在定义代码时不指定具体类型,而是在使用代码时再指定类型,从而实现代码的复用性和可扩展性。在 C# 中,泛型具有以下特点:

  • 泛型是类型安全的,不会产生运行时类型转换错误。
  • 泛型可以避免因类型转换而导致的性能损失。
  • 泛型可以在编译时检查类型,避免在运行时被意外地传递了错误的类型。
  • 泛型可以支持多种不同类型的参数化类型,从而实现更灵活的代码重用。
泛型类

泛型类是使用泛型的一种方式,它可以定义一个通用的类,然后在使用时再指定具体类型。以下是一个泛型类的例子:

public class MyList<T>
{
    private List<T> _list = new List<T>();

    public void Add(T item)
    {
        _list.Add(item);
    }

    public T Get(int index)
    {
        return _list[index];
    }

    public int Count
    {
        get { return _list.Count; }
    }
}

在上面的例子中,我们使用了 T 来表示类型参数,它可以被替换为任何类型。创建 MyList 对象时,可以指定具体的类型参数,例如:

MyList<int> intList = new MyList<int>();
intList.Add(1);
intList.Add(2);
intList.Add(3);
Console.WriteLine(intList.Get(0)); // 输出 1
泛型方法

泛型方法是定义一个通用方法,它可以接受不同类型的参数,从而提高代码的复用性。以下是一个泛型方法的例子:

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

在上面的例子中,我们使用了 T 来表示类型参数,并且使用了 where 语句限制了 T 必须实现 IComparable<T> 接口,从而保证能够比较大小。使用时,可以指定具体的类型参数,例如:

int maxInt = Max(1, 2);
Console.WriteLine(maxInt); // 输出 2

string maxString = Max("abc", "def");
Console.WriteLine(maxString); // 输出 def
泛型约束

泛型约束是一个限制类型参数的方式,从而使得泛型代码更加安全和可靠。以下是一些常见的泛型约束:

  • where T : class:指定 T 必须是引用类型。
  • where T : struct:指定 T 必须是值类型。
  • where T : new():指定 T 必须有公共无参数的构造函数。
  • where T : SomeInterface:指定 T 必须实现 SomeInterface 接口。

例如,以下是一个使用泛型约束的例子:

public static T Clone<T>(T obj) where T : ICloneable
{
    return (T)obj.Clone();
}

在上面的例子中,我们使用了 where 语句限制了 T 必须实现 ICloneable 接口,从而保证可以使用 Clone 方法进行复制。使用时,可以指定具体的类型参数,例如:

int[] numbers = { 1, 2, 3 };
int[] clonedNumbers = Clone(numbers);
Console.WriteLine(clonedNumbers[0]); // 输出 1