C#运行时是否会对内置类型的typeof值进行缓存?
.NET 中 typeof 运算符的求值缓存机制
结论:你不需要手动用static变量存储typeof(内置类型)的结果,运行时默认已经做了全局缓存,重复调用不会产生额外的求值开销。
具体原理如下:
typeof是编译期解析的运算符,C#编译器会把typeof(T)的调用编译为调用Type.GetTypeFromHandle(RuntimeTypeHandle)方法,传入的是T对应的固定运行时类型句柄,不需要每次执行时动态扫描类型元数据。- .NET 运行时对同一个AppDomain内加载的每个类型,只会生成唯一的
Type实例,不管你调用多少次typeof(T),拿到的都是同一个对象的引用,不会重复构建Type对象。
你可以通过下面的代码验证这个特性:
var t1 = typeof(int); var t2 = typeof(int); // 输出为True,说明两次调用拿到的是同一个对象 Console.WriteLine(ReferenceEquals(t1, t2));
补充说明
如果是非常极端的性能敏感场景,你手动定义static readonly Type IntType = typeof(int);也不会有问题,但是收益非常有限:原生typeof调用的开销已经低到纳秒级,绝大多数场景下感知不到差异。
内容的提问来源于stack exchange,提问作者lonix
相关产品推荐
相关产品推荐

