彼自身の物議を醸す質問への回答で、マッシュは、.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#コードでは)このようなことを行うには、安全でないキーワードが必要だと思いました。なぜここで必要ないのですか?これは、純粋に管理された「安全な」コードが実際にはまったく安全ではないことを意味しますか?