MST
星途 面试题库

面试题:C# 数据类型在泛型中的应用

假设你要创建一个通用的栈数据结构,使用 C# 泛型实现。要求考虑栈的基本操作如压栈(Push)、弹栈(Pop)以及获取栈顶元素(Peek),同时要对泛型类型进行适当的约束,确保只有引用类型可以使用该栈。请写出实现代码,并解释为什么要这样进行约束。
26.8万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试
public class Stack<T> where T : class
{
    private T[] elements;
    private int top;

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

    public void Push(T item)
    {
        if (top == elements.Length - 1)
        {
            Array.Resize(ref elements, elements.Length * 2);
        }
        elements[++top] = item;
    }

    public T Pop()
    {
        if (top == -1)
        {
            throw new InvalidOperationException("Stack is empty");
        }
        return elements[top--];
    }

    public T Peek()
    {
        if (top == -1)
        {
            throw new InvalidOperationException("Stack is empty");
        }
        return elements[top];
    }
}

解释约束原因

将泛型类型 T 约束为 class 确保只有引用类型可以使用该栈。这是因为在很多场景下,值类型和引用类型在内存管理、传递方式等方面有较大区别。例如,引用类型在传递时是传递引用,而值类型是传递副本。对于栈这种数据结构,如果不加以约束,值类型入栈和出栈时可能会涉及不必要的内存复制操作,影响性能。而且在某些复杂的应用场景中,可能需要对栈中的元素进行多态操作,引用类型可以更方便地实现多态,而值类型则较难做到。此外,约束为引用类型还可以避免一些值类型可能带来的装箱拆箱操作,提高程序运行效率。