Jupyter AI

1 泛型概述

📅 发表日期: 2024年8月13日

分类: 🔷C# 高级

👁️阅读: --

在 C# 中,泛型是一个强大的特性,允许你在定义类、接口、方法时,使用类型参数来提高代码的灵活性和可重用性。泛型的引入使得我们可以编写类型安全的代码,同时避免类型转换带来的性能损失和潜在的运行时错误。

为什么使用泛型?

使用泛型的主要优势在于:

  1. 类型安全:泛型能够确保类型安全,在编译时检查类型,提高了代码的安全性。
  2. 性能优化:通过消除装箱和拆箱操作,提升了性能,特别是在使用值类型时。
  3. 代码重用:泛型可以让你编写更加通用的代码,而无需为每种数据类型编写重复的代码。

泛型类

一个基本的泛型类示例如下:

public class GenericList<T>
{
    private T[] items;
    private int count;

    public GenericList(int size)
    {
        items = new T[size];
        count = 0;
    }

    public void Add(T item)
    {
        if (count < items.Length)
        {
            items[count++] = item;
        }
    }

    public T Get(int index)
    {
        if (index < count)
        {
            return items[index];
        }
        throw new IndexOutOfRangeException();
    }
}

在这个例子中,GenericList<T> 是一个泛型类,其中 T 可以被任何类型所替代。你可以这样使用这个泛型类:

GenericList<int> intList = new GenericList<int>(10);
intList.Add(1);
intList.Add(2);
intList.Add(3);
Console.WriteLine(intList.Get(0)); // 输出 1

GenericList<string> stringList = new GenericList<string>(10);
stringList.Add("Hello");
stringList.Add("World");
Console.WriteLine(stringList.Get(1)); // 输出 World

泛型方法

除了泛型类外,C# 也支持泛型方法。你可以在方法中定义一个或多个类型参数。

public static T Max<T>(T x, T y) where T : IComparable
{
    return x.CompareTo(y) > 0 ? x : y;
}

在这个例子中,Max 方法接受两个相同类型的参数并返回较大的一个。你可以这样使用它:

int maxInt = Max(5, 10); // 输出 10
string maxString = Max("apple", "banana"); // 输出 banana

泛型接口

C# 还允许定义泛型接口。泛型接口与泛型类类似,在接口中定义类型参数。

public interface IRepository<T>
{
    void Add(T item);
    T Get(int id);
}

实现泛型接口的类如下:

public class Repository<T> : IRepository<T>
{
    private List<T> items = new List<T>();

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

    public T Get(int id)
    {
        return items[id];
    }
}

使用 Repository 泛型类的方式如下:

IRepository<string> repo = new Repository<string>();
repo.Add("Item1");
repo.Add("Item2");
Console.WriteLine(repo.Get(0)); // 输出 Item1

约束

泛型的一个重要特性是可以为类型参数设置约束,以指定使用泛型类型时满足的条件。

public class GenericClass<T> where T : IDisposable
{
    public void Dispose(T item)
    {
        item.Dispose();
    }
}

在这个例子中,GenericClass<T> 的类型参数 T 被约束为实现 IDisposable 接口的类型,这样你就可以安全地调用 Dispose 方法。

总结

泛型大大增强了 C# 的类型系统,使得开发者能够编写更加安全、高效和可重用的代码。通过理解和应用泛型特性,我们可以在构建复杂应用程序时避免许多常见的错误和性能瓶颈。

在下一篇文章中,我们将深入探讨 C# 的动态类型特性,这也是一种实现灵活性的强大工具。欢迎继续关注!

No previous page