MST

星途 面试题库

面试题:C#泛型约束的应用场景

说明C#中泛型约束有哪些类型,每种类型的泛型约束在实际编程中有哪些典型的应用场景,并举例说明如何在代码中正确使用泛型约束来确保类型安全和提高代码的复用性。
22.8万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试
  1. 泛型约束类型

    • where T : struct:表示类型参数 T 必须是值类型。
    • where T : class:表示类型参数 T 必须是引用类型。
    • where T : new():表示类型参数 T 必须有一个无参数的公共构造函数。
    • where T : :表示类型参数 T 必须是指定基类或派生自指定基类。
    • where T : :表示类型参数 T 必须实现指定的接口。
    • where T : U:表示类型参数 T 必须是类型参数 U 或派生自类型参数 U
  2. 典型应用场景及示例

    • where T : struct
      • 应用场景:适用于需要处理值类型集合或算法,比如简单数据类型的集合操作,利用值类型的特性提高性能。
      • 示例代码
public static void Swap<T>(ref T a, ref T b) where T : struct
{
    T temp = a;
    a = b;
    b = temp;
}
  • where T : class
    • 应用场景:当需要处理引用类型,比如对象的比较、序列化等操作,引用类型的特性使得这些操作更适合在这种约束下进行。
    • 示例代码
public static bool AreEqual<T>(T a, T b) where T : class
{
    if (ReferenceEquals(a, b)) return true;
    if (ReferenceEquals(a, null) || ReferenceEquals(b, null)) return false;
    return a.Equals(b);
}
  • where T : new()
    • 应用场景:常用于对象池、依赖注入等场景,需要在运行时创建类型实例。
    • 示例代码
public static T CreateInstance<T>() where T : new()
{
    return new T();
}
  • where T :
    • 应用场景:在处理具有相同基类的对象层次结构时,保证类型的一致性,例如图形绘制系统中处理不同形状(都继承自 Shape 基类)。
    • 示例代码
public class Shape { }
public class Circle : Shape { }
public class Rectangle : Shape { }

public static void DrawShapes<T>(List<T> shapes) where T : Shape
{
    foreach (var shape in shapes)
    {
        // 假设 Shape 类有 Draw 方法
        shape.Draw();
    }
}
  • where T :
    • 应用场景:用于实现多态行为,只要类型实现了指定接口,就可以在泛型方法或类中统一处理,比如实现了 IComparable 接口的类型比较。
    • 示例代码
public static T FindMax<T>(List<T> list) where T : IComparable<T>
{
    T max = list[0];
    foreach (var item in list)
    {
        if (item.CompareTo(max) > 0)
        {
            max = item;
        }
    }
    return max;
}
  • where T : U
    • 应用场景:在泛型类型参数之间建立继承关系,确保类型兼容性,例如在一些通用数据处理框架中,子类型的处理依赖于父类型的约束。
    • 示例代码
public static void Process<T, U>(T item) where T : U
{
    // 对 item 进行操作,由于 T 是 U 或 U 的派生类型,可以使用 U 的成员
}