2009-12-30 4 views
1

Я сейчас изучаю C# и задаюсь вопросом, как отображать фактическое значение ссылки или адрес структуры. Я ищу что-то аналогичное следующему коду C:Как я могу отобразить фактическое значение ссылки в C#

int i; 
    printf("int i resides at memory location %x",&i); 
+1

Нет такой вещи в C# –

+0

Что вы пытаетесь достичь? Что вы пытаетесь узнать? Возможно, вы не сможете научиться этому таким образом. –

+0

Я пытаюсь увидеть, как многомерные массивы строк хранятся в куче. Я врожденный парень и хочу посмотреть, куда все пойдет. – tkyle

ответ

8

В unsafe контексте, это будет работать в C#:

int i = 10; 
int *ptr = &i; 
Console.WriteLine((int)ptr); 

Я не знаю, если это может быть сделано в безопасном контексте, или, если это так, то как (я подозреваю, что это не может).

+0

В нетривиальном приложении это будет постоянным? Я бы предположил, что если это сохранится до 2-го поколения, оно может быть постоянным, но до этого оно может двигаться. Я никогда не пробовал. – GrayWizardx

+2

Раздел 18.3 спецификации C# объясняет это довольно подробно. Посмотрите на «фиксированный» статус. http://msdn.microsoft.com/en-us/library/f58wzh21.aspx. Это сводится к тому, смотрит ли указатель на то, что GC считает подвижным или нет. – Gregory

+4

Приведенный код будет показывать содержимое стека, а не кучу GC. Чтобы создать указатель на ссылочный тип, сначала нужно зафиксировать его. Это Хейсбергиан, теперь вы больше не смотрите на обычную компоновку кучи. Используйте расширение отладчика sos.dll, команду dumpheap. –

6

Этого нельзя сделать на C#, о котором я знаю. .NET позволяет свободно перемещать куски памяти по своему усмотрению, поэтому адрес переменной имеет в лучшем случае только временный смысл.

0

Хотя вы можете сделать это в некоторых контекстах, результат в значительной степени бессмыслен. Как уже отмечалось, References are not addresses - или, по крайней мере, они не имеют быть. Так что вы пытаетесь, даже если оно работает, не гарантируется во всех реализациях и обычно не особенно полезно. Если вы не придавить, то значение не является надежным, и если вы сделать штифт вы изменить саму вещь, которую вы сообщаете ...

Действительно, вы должны использовать различные инструменты вне язык для это ... windbg + SOS, например.

Смежные вопросы