You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CLR是否每次方法调用前创建Type对象?复用逻辑及实例咨询

嘿,这个问题问到点子上了!很多刚接触CLR的开发者都会对Type对象的生命周期有疑惑,我来给你掰扯清楚~

CLR中Type对象的创建与复用逻辑

核心结论先抛出来:CLR绝对不会在每次方法调用前重新创建Type对象,每个加载到当前AppDomain的类型,只会对应一个System.Type实例,后续所有需要访问该类型元数据的地方,都会直接复用这个已创建的对象。

背后的运行机制

当CLR第一次遇到某个类型(比如你提到的Person类)时,会完成以下操作:

  1. 从程序集的元数据中读取该类型的定义信息
  2. 在托管堆上创建对应的System.Type对象
  3. 将这个Type对象存入CLR的类型缓存中,后续任何代码需要获取该类型的Type信息时,直接从缓存取出复用

用Person类的例子验证

假设你有这样两段使用Person类型的代码:

public class Person { /* 你的类定义 */ }

// 方法1:直接通过typeof获取Type
public void ProcessPersonType()
{
    Type personType = typeof(Person);
    Console.WriteLine(personType.GetHashCode());
}

// 方法2:通过实例的GetType获取Type
public void ProcessPersonInstance()
{
    Person person = new Person();
    Type personType = person.GetType();
    Console.WriteLine(personType.GetHashCode());
}

不管你调用ProcessPersonType多少次,或者交叉调用ProcessPersonInstance多少次,控制台输出的哈希码都是一样的——这就证明了两次获取的是同一个Type对象。你甚至可以用引用相等性来直接验证:

bool isSameTypeObject = ReferenceEquals(typeof(Person), new Person().GetType());
// isSameTypeObject的结果是true,完全坐实了复用逻辑

额外注意点

  • 这里的“唯一”是针对同一个AppDomain的,如果同一个类型被加载到不同的AppDomain中,每个AppDomain会有独立的Type对象,但在单个AppDomain内,同一个类型的Type对象绝对唯一。
  • 不仅是自定义类,.NET框架自带的类型(比如string、int)也遵循这个逻辑,它们的Type对象同样是全局复用的。

内容的提问来源于stack exchange,提问作者Huso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:01:53