2013-07-11 3 views
2

В C# как вы можете получить адрес переменной без использования ключевого слова unsafe. Я не хочу менять адрес или доступ к нему, просто укажите его местоположение.Получение адреса местоположения переменной

+0

Я не думаю, что это возможно без использования методов 'unsafe' – jAC

+0

Я не считаю, что это возможно без использования ключевого слова' unsafe', так как вам нужно явно получить указатель на переменную, чтобы получить свой адрес. 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.