C# 中的泛型参数区分值类型或引用类型
本文最后更新于 2021年4月4日 晚上
在实现 Stack 的过程中, 给定一个泛型参数 T, 假设 T 是引用类型, 则可以在栈为空的时候返回 null, 但如果是值类型就不行了, 那如何判断泛型参数是值类型还是引用类型呢? 这个就是这篇文章需要探索的内容.
IStack 接口定义如下所示:
1 | |
在实现过程中, 主要是 Pop 方法和 Top 属性二者的实现需要考虑值类型和引用类型的区别, 因为值类型没有 null.
在需要返回 T 类型对象的情况下, 有如下两种处理方式:
如果对值类型和引用类型合并考虑, 则可以返回
default(T). 这样的话, 如果T是引用类型, 则返回 null, 如果是值类型, 则返回对应的默认值(比如int默认是0,char默认是\0等等).如果对值类型和引用类型分开考虑, 则可以在实现上对
T添加泛型约束:1
2
3
4// 对 T 添加泛型约束, 表明 T 是引用类型的.
public class Stack<T> : IStack<T> where T : class {
//...
}
C# 中的泛型参数区分值类型或引用类型
https://blog.rayy.top/2019/09/09/2019-2019-09-09-CSharpGenericsOptional/