c# - 引用类型——我们能看到实际的引用吗?

标签 c# .net vb.net clr il

引用类型和值类型之间的区别常常让初学者感到困惑,因为他们不了解值类型的变量实际上包含什么。我们知道:

  • 值类型存储实际
  • 引用类型只存储对象的引用

是否可以检查每种变量以查看值或实际引用本身?引用是否存储为某种编码值?我知道引用可以按值传递,所以我假设是这样。

我认为这将有助于新手的理解,并且探索起来非常有趣。

最佳答案

Is it possible to inspect each kind of variable to either see the value, or the actual reference itself?

澄清一下,引用类型的变量引用。引用即值。

引用是一种值,就像 int 是一种值一样。与 int 不同,引用是一个只能被复制取消引用 的值;你不能在 C# 中直接观察它的值,因为它的值是垃圾收集器的一个实现细节。

Is the reference stored as some kind of coded value?

是的,没错。实际上,引用是一个 32 位或 64 位整数(取决于您是在 32 位还是 64 位进程中),它是指向垃圾收集器已知的与所引用对象的数据相关联的某些结构的指针.

如果您想直接查看引用资料,那么调试器就是这样做的工具。将 C# 代码加载到调试器中,对其进行编译、运行、命中断点,然后查看堆栈和寄存器的状态。稍微聪明一点,您应该能够找出哪些堆栈位置和寄存器对应于哪些局部变量。值类型的局部变量对应的位置将包含值;那些引用类型将包含看起来像指针的值。如果您在内存窗口中检查这些指针,您将看到由垃圾收集器维护的描述对象内容的结构。

关于c# - 引用类型——我们能看到实际的引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8819154/

相关文章:

vb.net - 在 Vb.Net 窗体中处理跨线程异常

.net - XmlReader - 将当前节点读取为字符串

c# - 为什么在调试我的 asp.net 网站时有时会弹出 disassembler/disassembly-window?

c# - While Loop 不会一直循环

.net - 在 Vista 而不是 XP 中开发 .Net 解决方案的优缺点

.net - ROWLEX 可以在商业项目中用作 .DLL 文件吗(因为某些非 LGPL 组件)?

VB.Net:在多个文件中包含通用代码

c# - 如何将字符串从托管 C#/Xaml WP8 组件传递到 D3D 组件?

c# - 学习 DLR(如何在其上实现一种语言)

c# - 使用 .NET 创建 tar.gz