В ответе на свой собственный спорный вопрос, Mash показал, что вам не нужно "небезопасное" ключевое слово для чтения и записи непосредственно в байты любого экземпляра объекта .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;
}
И тогда вы можете делать что-то вроде изменения неизменяемой строки. Следующий код печатает "бар" на моей машине:
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, развращая ссылки на объекты той же техникой.
Вопрос: Я думал, что (в чистом управляемом коде С#) ключевое слово unsafe было необходимо для выполнения подобных действий. Почему здесь не нужно? Означает ли это, что чистый управляемый "безопасный" код вообще не безопасен?