В ответе на его собственный спорный вопрос, Mash показал, что вам не нужно ключевое слово "unsafe" для чтения и записи непосредственно в байты любого экземпляра объекта .NET. Вы можете объявить следующие типы:
[StructLayout(LayoutKind.Explicit)]
struct MemoryAccess
{
[FieldOffset(0)]
public object Object;
[FieldOffset(0)]
public TopBytes Bytes;
}
class TopBytes
{
public byte b0;
public byte b1;
public byte b2;
public byte b3;
public byte b4;
public byte b5;
public byte b6;
public byte b7;
public byte b8;
public byte b9;
public byte b10;
public byte b11;
public byte b12;
public byte b13;
public byte b14;
public byte b15;
}
И тогда вы можете делать такие вещи, как изменение «неизменяемой» строки. Следующий код печатает «bar» на моей машине:
string foo = "foo";
MemoryAccess mem = new MemoryAccess();
mem.Object = foo;
mem.Bytes.b8 = (byte)'b';
mem.Bytes.b10 = (byte)'a';
mem.Bytes.b12 = (byte)'r';
Console.WriteLine(foo);
Вы также можете вызвать AccessViolationException, повредив ссылки на объекты с помощью такая же техника.
Вопрос. Я думал, что (в чисто управляемом коде C#) Ключевое слово unsafe было необходимо, чтобы делать подобные вещи. Почему здесь не надо? Означает ли это, что чистый управляемый "безопасный" код вообще небезопасен?