В an answer его собственным controversial question, Mash проиллюстрировал, что для чтения и записи непосредственно в байты любого экземпляра объекта .NET вам не нужно «небезопасное» ключевое слово. Вы можете объявить следующие типы:Почему этот код работает без ключевого слова unsafe?
[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 коррумпируя ссылки на объект с той же техникой.
Вопрос: Я думал, что (в чистом управляемом коде C#) ключевое слово unsafe было необходимо для выполнения подобных действий. Почему здесь не нужно? Означает ли это, что чистый управляемый «безопасный» код не совсем безопасен вообще?
Спасибо за изменение способа задать тот же вопрос. Предыдущая нить была переполнена. – Mash
@Mash: проблем нет. Надеемся, что это направит еще более позитивное внимание на ваш первоначальный вопрос. –
@wcoenen: Это не важно, действительно, даже если бы я думал об этом - мой вопрос - это контент сообщества, и я ничего не зарабатываю от него. Поэтому важно только положительное обсуждение. И кажется, что ваш вопрос выглядит лучше :) – Mash