在不使用关键字C#
的情况下如何获取变量的地址。unsafe
我不想更改地址或访问它,只是有它的位置。
问问题
2985 次
3 回答
17
你不能。
并且有充分的理由,因为地址不固定。它可以——也将——被 CLR 的内存管理移动。
于 2013-07-11T12:43:54.933 回答
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类型。
于 2013-07-11T12:47:29.803 回答
4
在提取其地址之前,您必须固定该对象。否则,GC 可以随意移动它。
object variable = new object();
GCHandle handle = GCHandle.Alloc(variable, GCHandleType.Pinned);
IntPtr address = handle.AddrOfPinnedObject();
通常,您只会在需要某种类型的非托管互操作的情况下执行此操作。然而,即便如此,也很少需要这种类型的手动操作。
于 2013-07-11T12:51:50.863 回答