In an answer zu seinem eigenen controversial question, Mash hat veranschaulicht, dass Sie nicht das Schlüsselwort "unsafe" zum Lesen und Schreiben direkt auf die Bytes von einer beliebigen .NET-Objektinstanz benötigen. Sie können die folgenden Typen deklarieren:Warum funktioniert dieser Code ohne das unsichere Schlüsselwort?
[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;
}
Und dann können Sie Dinge wie eine "unveränderliche" Zeichenfolge ändern. Der folgende Code druckt „bar“ auf meinem Rechner:
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);
Sie können auch eine AccessViolationException auslösen, indem Objektreferenzen mit der gleichen Technik korrumpieren.
Frage: Ich dachte, dass (in reinem verwaltetem C# -Code) das Schlüsselwort unsafe notwendig war, um solche Dinge zu tun. Warum ist es hier nicht nötig? Bedeutet dies, dass reiner verwalteter "sicherer" Code überhaupt nicht sicher ist?
Danke für die Änderung einer Art, die gleiche Frage zu stellen. Vorheriger Thread wurde überflammt. – Mash
@Mash: Kein Problem. Hoffentlich wird das mehr auf Ihre ursprüngliche Frage lenken. –
@wcoenen: Es ist nicht wirklich wichtig, auch wenn ich darüber nachdenke - meine Frage ist Gemeinschaftsinhalt und ich verdiene nichts daraus. Das einzig Wichtige ist eine positive Diskussion. Und scheint Ihre Frage sieht besser aus :) – Mash