Betrachten Sie den folgenden Code ein:Sollte der Inhalt eines solchen Strings eine Ausnahme verursachen?
using System;
using System.Runtime.InteropServices;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
const string test = "ABCDEF"; // Strings are immutable, right?
char[] chars = new StringToChar{str=test}.chr;
chars[0] = 'X';
// On an x32 release or debug build or on an x64 debug build,
// the following prints "XBCDEF".
// On an x64 release build, it prints "ABXDEF".
// In both cases, we have changed the contents of 'test' without using
// any 'unsafe' code...
Console.WriteLine(test);
}
}
[StructLayout(LayoutKind.Explicit)]
public struct StringToChar
{
[FieldOffset(0)]
public string str;
[FieldOffset(0)]
public char[] chr;
}
}
Durch diesen Code ausgeführt wird, sind wir in der Lage, den Inhalt eines Strings ohne Ausnahme auftritt zu ändern. Wir mussten dazu keinen unsicheren Code deklarieren. Dieser Code ist eindeutig sehr fragwürdig!
Meine Frage ist einfach das: Denken Sie, dass eine Ausnahme durch den obigen Code ausgelöst werden sollte?
[EDIT1: Beachten Sie, dass andere Leute das für mich haben versucht, und einige Leute unterschiedliche Ergebnisse erhalten - was auch nicht die nastyness gegebenes Suprising, was ich tue ...;)]
[ EDIT2: Beachten sie, dass ich Visual Studio 2010 auf Windows 7 Ultimate 64 Bit]
[EDIT3 bin mit: Aus dem Test-String const, es einfach zu machen, noch mehr zwielichtige]
Duplikat einer [Frage, die ich bereits gestellt habe] (http://stackoverflow.com/questions/792735/why-does-this-code-work-without-the-unsafef-keyword) :-) –
Sehr interessant! Sieht so aus, als ob das ein bekanntes Problem ist. –