2014-02-08 3 views
2

IIRC от C, вы можете иметь заявление по этим направлениям:Форсировать уровень памяти отливать

char* str = "1234"; 
int nonStr = *((int*)str); 

(я намеренно сделал строку 4-х символов, так в среднем сценарии он будет иметь такое же количество байтов, как целое число.) Это приведет к разыменованию памяти, в которой хранится str, и даст вам значение, если оно было целым числом (522207554, если я сделал правильное преобразование).

Есть ли способ сделать то же самое в C#? Я знаю, что это операция с низким уровнем памяти, которая, как правило, блаженно скрыта от программиста на C#, я делаю это только для обучения.

+1

A 'учение' упражнения! Конечно, мы хотим поощрять хорошие привычки, а не злоупотреблять указателями вроде этого - особенно на C#. Если вы хотите научить злоупотребления указателями, по крайней мере, это сделать в подходящем контексте - C/C++ в среде с низким уровнем/ОС. Не C#. – Skizz

+0

Возможный дубликат [.NET String to byte Array C#] (http://stackoverflow.com/questions/472906/net-string-to-byte-array-c-sharp) –

+0

@ Сциблируйте все, что злоупотребляет ими, «указать», что их можно злоупотреблять, даже случайно. Я хочу объяснить, что происходит в памяти за кулисами, чтобы ученики поняли, почему они получают «InvalidCastException»! Я не собираюсь научить их когда-либо писать «настоящие» программы таким образом. –

ответ

5

Вы можете сделать это с помощью небезопасного контекста и fixed заявление:

static unsafe void Main(string[] args) 
{ 
    string str = "1234"; 
    fixed(char* strPtr = str) 
    { 
     int* nonStr = (int*)strPtr; 
     Console.WriteLine(*nonStr); 
    } 
} 

печатает

3276849 
+0

'char' в C# является двухбайтовой структурой (кодировка UTF-16), поэтому вам нужно ** ** ** символов в строке. Вы можете видеть, что здесь: 3276849 в шестнадцатеричном формате - 0x00320031 («34» не были скопированы). –

1

Вы ищете unsafe функциональность C#.

Адрес one reference. Общий поиск «разыменования небезопасных указателей C#» приводит к множеству результатов.

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