正在获取变量的地址位置

本文关键字:地址 位置 变量 获取 | 更新日期: 2023-09-27 18:22:08

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

正在获取变量的地址位置

你不能
有充分的理由,因为地址不是固定的。CLR的内存管理可以也将移动它。

由于.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引用的位置,并且它不适用于所有类型,仅适用于可闪电传输的类型。

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

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

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