通过阅读文档和理论,我了解到对象变量是存储堆中存储的实际数据的内存地址的引用变量。我也可以在几年前的文章中看到同样的情况:[屏幕截图显示obj变量包含另一个内存地址作为其值]
但启动Visual Studio 2022时,我尝试了类似的操作,但现在我看到的Object变量直接包含Object值:[显示包含值的对象变量person的屏幕截图]
有人能好心地指导我正确的方向,以了解C#是否发生了根本性的变化吗?这是否意味着Object变量当前在堆栈中存储数据?
e5njpo681#
问题是 *&[object_variable]在不同版本的. Net中包含不同类型的数据。不,问题是您误解了Visual Studio不同版本中监 windows 口的行为。托管对象的memory layout从一开始就没有更改过:
托管引用由TypedReference结构表示,尽管您几乎不需要直接使用它(特别是因为我们有了强类型的ref局部变量和返回类型),但一般来说,你可以用它来处理托管引用本身。它的第一个字段指向堆上的对象示例,但严格地说,所指向的地址是刚好在指向方法表的实际字段数据之前的另一个指针VS2022足够聪明,可以识别出您对托管对象示例的解引用,即使您是通过非托管指针执行的(如果对象被GC重新定位,则可能会无效,因此您不应该依赖它而不进行固定)。在this answer(解决方案2)中,您可以看到如何利用TypedReference类型来更改托管对象示例的实际内存,但由于.NET Core,我们也有更优雅的解决方案。
TypedReference
kwvwclae2#
&obj是 * 局部变量 * 的地址(在堆栈上)-而不是堆上对象的地址;你所显示的一切看起来最有可能是一个IDE的小故障与一个不寻常的表达;*&obj与obj基本相同
&obj
*&obj
obj
2条答案
按热度按时间e5njpo681#
问题是 *&[object_variable]在不同版本的. Net中包含不同类型的数据。
不,问题是您误解了Visual Studio不同版本中监 windows 口的行为。托管对象的memory layout从一开始就没有更改过:
托管引用由
TypedReference
结构表示,尽管您几乎不需要直接使用它(特别是因为我们有了强类型的ref局部变量和返回类型),但一般来说,你可以用它来处理托管引用本身。它的第一个字段指向堆上的对象示例,但严格地说,所指向的地址是刚好在指向方法表的实际字段数据之前的另一个指针VS2022足够聪明,可以识别出您对托管对象示例的解引用,即使您是通过非托管指针执行的(如果对象被GC重新定位,则可能会无效,因此您不应该依赖它而不进行固定)。在this answer(解决方案2)中,您可以看到如何利用
TypedReference
类型来更改托管对象示例的实际内存,但由于.NET Core,我们也有更优雅的解决方案。kwvwclae2#
&obj
是 * 局部变量 * 的地址(在堆栈上)-而不是堆上对象的地址;你所显示的一切看起来最有可能是一个IDE的小故障与一个不寻常的表达;*&obj
与obj
基本相同