获取变量的地址位置

时间:2013-07-11 12:41:38

标签: c#

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

3 个答案:

答案 0 :(得分:17)

你不能。
并且有充分的理由,因为地址不固定。它可以 - 并且将 - 通过CLR的内存管理来移动。

答案 1 :(得分: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引用的 new 位置,并且它不适用于所有类型 - 只有blittable种类型。

答案 2 :(得分:4)

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

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

通常,您只能在需要某种类型的非托管互操作的场景中执行此操作。然而,即使这样,也很少需要这种类型的手动操作。