MST
星途 面试题库

面试题:C#泛型类型约束相关问题

在C#泛型编程中,简述where T : struct这种类型约束的作用,并且举例说明在哪些场景下会用到这种约束。
14.9万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

作用

where T : struct 这种类型约束表示泛型类型参数 T 必须是值类型。这确保了在使用泛型的代码中,T 只能被替换为诸如 intboolstruct 自定义结构体等值类型,而不能是引用类型。这样做有以下好处:

  1. 性能优化:值类型通常在栈上分配,相较于引用类型在堆上分配,减少了垃圾回收的压力,在对性能敏感的场景下有更好的表现。
  2. 明确类型特性:让代码的使用者清楚知道泛型参数的类型特性,避免将引用类型误传入。

场景举例

  1. 简单数据存储结构:实现一个简单的泛型栈结构,由于栈操作对性能要求较高,并且栈内元素通常为值类型,使用 where T : struct 约束可确保性能。
public class Stack<T> where T : struct
{
    private T[] items;
    private int top;

    public Stack(int capacity)
    {
        items = new T[capacity];
        top = -1;
    }

    public void Push(T item)
    {
        if (top == items.Length - 1)
        {
            // 处理栈满情况
        }
        items[++top] = item;
    }

    public T Pop()
    {
        if (top == -1)
        {
            // 处理栈空情况
        }
        return items[top--];
    }
}
  1. 数学计算相关泛型方法:例如实现一个求两个泛型类型参数之和的方法,用于基本数值类型(值类型)的计算。
public static class MathUtils
{
    public static T Add<T>(T a, T b) where T : struct, IAdditionOperators<T, T, T>
    {
        return a + b;
    }
}

这里 where T : struct, IAdditionOperators<T, T, T> 不仅要求 T 是值类型,还要求 T 实现了加法操作符,使得该方法可用于数值类型的加法运算,如 intfloat 等。