16.1 泛型概念
泛型允许编写与类型无关的代码,提高复用性和类型安全。
非泛型问题
1 | // 需要为每种类型写一个方法 |
泛型解决方案
1 | T Max<T>(T a, T b) where T : IComparable<T> |
16.2 泛型类
1 | public class Repository<T> |
16.3 泛型方法
1 | public static void Swap<T>(ref T a, ref T b) |
16.4 类型约束
约束类型
| 约束 | 说明 | 示例 |
|---|---|---|
where T : struct |
值类型 | where T : struct |
where T : class |
引用类型 | where T : class |
where T : new() |
有无参构造函数 | where T : new() |
where T : BaseClass |
继承基类 | where T : Animal |
where T : Interface |
实现接口 | where T : IComparable |
示例
1 | // 多个约束 |
16.5 泛型接口
1 | public interface IRepository<T> |
16.6 协变与逆变
协变(out)
1 | // IEnumerable<out T> 是协变的 |
逆变(in)
1 | // Action<in T> 是逆变的 |
16.7 default 关键字
1 | T GetDefault<T>() |
16.8 泛型缓存
1 | public static class Cache<T> |
16.9 本章小结
- 泛型提高代码复用性和类型安全
- 泛型类、方法、接口支持类型参数
- 类型约束限制泛型类型范围
out协变,in逆变default返回类型默认值
练习题
- 创建泛型方法
AreEqual<T>(T a, T b)比较两个值 - 实现泛型栈
Stack<T> - 使用类型约束创建泛型排序方法
- 以下代码能否编译?
1
2
3class Test<T> { public T Value = default; }
var t = new Test<int>();
Console.WriteLine(t.Value);