2013-07-11 72 views
2

C#如何在不使用关键字unsafe的情况下获取变量的地址。 我不想改变地址或访问它,只是有它的位置。获取变量的地址位置

+0

如果不使用'unsafe'方法,我不认为这是可能的 – jAC

+0

我不相信这是不可能的,因为你需要显式地获取指向变量的指针以获取其地址。 http://msdn.microsoft.com/en-us/library/zcbcf4ta(v=vs.110).aspx –

+4

只是想知道....为什么? –

回答

4

您必须在提取地址之前固定对象。否则,GC可以自由移动。

object variable = new object(); 
GCHandle handle = GCHandle.Alloc(variable, GCHandleType.Pinned); 
IntPtr address = handle.AddrOfPinnedObject(); 

通常情况下,您只会在需要某种非托管互操作的情况下执行此操作。然而,即使那样,也很少需要这种手动操作。

17

你不能。
而且有很好的理由,因为地址不固定。它可以 - 也将会 - 被CLR的内存管理所移动。

7

由于.NET感动身边所有的时间管理的内存变量,你需要“销”的变量,然后用GCHandle获取其位置:

static void Main() 
{ 

    string myVar = "This is my string"; 

    GCHandle handle = GCHandle.Alloc(myVar, GCHandleType.Pinned); 
    IntPtr pointer = GCHandle.ToIntPtr(handle); 

    Console.WriteLine(pointer); 

    handle.Free(); 

} 

不过,我相信这实际上移动的原始变量为新的位置由GCHandle引用,并且它不适用于所有类型 - 只有blittable类型。