在 Wikipedia 上阅读有关打包/拆包的信息,
将引用类型拆箱为值意味着必须显式完成此操作。在这种情况下,首先必须确保被引用的装箱对象的类型与原来的类型相对应,其次,将装箱对象的数据字段复制到该类型的新变量中。通常,类型检查是使用生成和处理异常的机制进行的,然后复制将对象的内部数据(字段)从“堆”传输到正在运行的应用程序的堆栈,其中存储了其局部变量. 具体操作的顺序简化为以下步骤:
如果指向装箱值类型的服务指针为空,则抛出 NullReferenceException,
如果装箱对象与所需类型不匹配,则会引发 InvalidCastException。
我遇到了他们在这里说的话:
1. 如果指向装箱值类型的服务指针为空,则抛出 NullReferenceException。
我是否正确理解“指向打包值类型的服务指针”应该理解“指向类型对象(TypeObjectPointer)的指针”?如果我是对的,TypeObjectPointer 可以为空吗?
这很可能是一种情况:
而且
TypeObjectPointer从理论上讲,它永远不可能是 Null,因为它存在于所有对象中,没有它,那么在 CLR 之前就无法知道对象是什么类型。甚至 System.Type 本身也引用了它自己:
我想你误会了。类型对象指针 - 可能是指向
System.Type编译器为每个类创建的类实例的指针,即使是抽象类也是如此。有一篇文章讲述了如何从对象的标头中检索此指针。
它不能等于
null堆上的任何对象。你在说什么服务指针?让我们试着找到英文的源文本。这是Jeffrey Richter通过 C# 编写的《CLR 》一书的节选:
如您所见,原文中没有文字服务。
当然,关键是如果你试图转换
null为有意义的类型,比如int,你最终会得到NullReferencePointer.文本的第二个问题是它显然自 2003 年以来就没有更新过。已经在 .NET 2 版本中出现了该类型
Nullable<T>,这是有意义的,但以第三种方式处理。如果对象指针等于null并强制转换为int?您将获得一个有效的值对象Nullable<Int32>,其IsNull.