2009-12-30 63 views
1

我正在学习有关C#的更多信息,并且想知道如何显示参考的实际值或结构的地址。我期待的是类似于以下C代码的东西:如何在C#中显示参考的实际值

int i; 
    printf("int i resides at memory location %x",&i); 
+1

C#中没有这样的东西# – 2009-12-30 03:20:56

+0

你想完成什么?你想学什么?你可能无法以这种方式学习它。 – 2009-12-30 03:42:00

+0

我想看看多维字符串数组是如何存储在堆上的。我是一个嵌入式的人,喜欢看事情的发展。 – tkyle 2009-12-30 03:49:09

回答

8

在一个unsafe背景下,这将在C#中的工作:

int i = 10; 
int *ptr = &i; 
Console.WriteLine((int)ptr); 

我不知道它是否能够在安全的前提下进行,或者,如果是这样,怎么(我怀疑它不能)。

+0

在一个非平凡的应用程序中,这是否会保持不变?我会假设如果这个存活到第二代,它可能是不变的,但在此之前它可能会移动。我从来没有尝试过。 – GrayWizardx 2009-12-30 03:31:58

+2

C#规范的第18.3节对此进行了相当彻底的解释。看看“固定”的说法。 http://msdn.microsoft.com/en-us/library/f58wzh21.aspx。它归结为指针是否正在查看GC认为可以移动或不移动的内容。 – Gregory 2009-12-30 04:26:17

+4

发布的代码将显示堆栈的内容,而不是GC堆。创建一个指向引用类型的指针需要先钉住它。那是Heisbergian,你现在不再看堆的正常布局。使用sos.dll调试器扩展,!dumpheap命令。 – 2009-12-30 04:34:51

6

这不能在C#中完成,我知道这一点。 .NET认为它适合于移动存储块,因此变量的地址最多只能具有临时含义。

0

虽然你可以在某些情况下做到这一点,但结果很大程度上没有意义。如前所述,References are not addresses - 或者至少,他们不是。所以,即使它有效,你所尝试的内容也不能保证所有的实现,并且通常不是特别有用。如果你不销,该值是不可靠的,如果你做你改变你的报告非常的事......

真的,你应该使用不同的工具的语言例如... windbg + SOS。

相关问题