C# 什么';类型定义和类型引用之间的区别是什么?

C# 什么';类型定义和类型引用之间的区别是什么?,c#,clr,C#,Clr,我正在读杰弗里·里克特写的《通过C#的CLR》 在第23章(23.3.2)中,它说“System.Type对象表示类型引用(与类型定义相反)。” 这里的类型引用和类型定义是什么意思?当您通过类、结构、接口或枚举定义新类型时,会发生类型定义 类型引用是有关类型的信息的集合,例如其名称或成员 System.Type类能够表示类型,但不能定义类型。 当您调用typeof(TypeName)或object.GetType()时,您将使用System.Type的对象处理类型的表示 仅使用System.ty

我正在读杰弗里·里克特写的《通过C#的CLR》

第23章(23.3.2)
中,它说
“System.Type对象表示类型引用(与类型定义相反)。”


这里的类型引用和类型定义是什么意思?

当您通过类、结构、接口或枚举定义新类型时,会发生类型定义

类型引用是有关类型的信息的集合,例如其名称或成员

System.Type
类能够表示类型,但不能定义类型。 当您调用
typeof(TypeName)
object.GetType()
时,您将使用
System.Type
的对象处理类型的表示

仅使用
System.type
对象不能直接实例化类型的对象。它只描述类型,而不是类型。这就是它被称为引用的原因。

类型定义意味着类型的实际实现,例如,如果它是一个类,则表示该类的定义(及其所有属性和字段)


类型引用,只是指
System.type
包含特定类型的详细信息,也就是说,它是关于该类型的元数据。

作者将
System.type
System.TypeInfo
进行对比。发件人:

TypeInfo对象表示类型定义本身,而type对象表示对类型定义的引用

仅当实现类(类型定义)的程序集已加载或可加载时,才能实例化类的
System.TypeInfo
。要实例化
系统.Type
,唯一的要求是当前程序包含对实现程序集的引用


另请参见

CLR规范可能对语言影响过大。程序集中的元数据区分了TypeDef和TypeRef。使用C#中的class、struct或delegate关键字,可以获得类型声明的TypeDef。当您使用在别处声明的类型时,会出现一个TypeRef。比如你对Object.GetType()或typeof关键字所做的。这里的“引用”与“引用和指针”中的概念相同吗@John WuSort,但类型引用不是指向内存地址,而是指向程序集(包括版本和强名称,如果适用)和类型名称。