【发布时间】:2016-10-13 08:52:51
【问题描述】:
我正在深入研究 .Net 内存结构,但对于在哪里/为什么会有关于引用(不是实际对象)的信息以及它属于什么类型的信息有点迷失。好吧,这有点令人困惑。让我解释一下我想通过这个例子来理解什么。我在方法内创建了以下内存对象:
Stream stream = new MemoryStream();
因此,我在堆上有一个对象,其中包含有关它的附加信息,表明它是一个内存流对象。同时我在堆栈上有一个参考。这个引用应该只是一个简单的 32/64 位字,指向堆上的对象。
但是,我只能使用 Stream 类的属性,对吧?那么,只是 Visual Studio IntelliSense 解析有关我创建的对象引用的信息,然后限制到 Stream 方法/属性,还是 CLR 将此信息(我将 MemoryStream 对象声明为 Stream)存储在任何地方并在执行期间检查它?
【问题讨论】:
-
CLR 在运行时知道每个对象的类型。
-
但是它怎么知道引用的是Stream呢?这些信息存储在哪里?
-
@Intetics:编译器知道这是对
Stream的引用,因此知道您可以调用哪些方法以及发出哪些代码。引用“指向”流的实例数据,但也有一些“隐藏”信息提供有关实际类型的信息(例如MemoryStream)。此类型信息可用于使用dynamic进行反射和后期绑定,还允许调用虚拟方法。但如果不涉及反射、后期绑定或虚方法,那么编译器只会在内存中的特定地址发出对特定方法的调用。