Ich will in einem String einen Text (sagen wir ABC) ersetzen durch einen anderen Text (sagen wir XYZ). Rufe ich die Replace-Methode auf, passiert aber nichts – der String ist immer noch der gleiche wie vorher. Was mache ich falsch? Oder ist das ein Bug in .NET?
Nein, das ist kein Bug sondern ein Feature. Strings sind immutable, also unveränderlich. Die Replace-Methode ändert nicht den String, auf dem Du sie aufrufst, sondern erzeugt einen neuen, in dem die gewünschte Änderung enthalten ist. Wenn Du mit dem neuen String weiterarbeiten willst, mußt Du ihn Deiner Variablen erneut zuweisen.
Marios Beispiel geht ins Leere, weil Empty ein *statisches* Feld der Klasse String ist (vom Typ String). Wenn das geändert wird, ändert sich keine Instanz von String.
Das Beispiel passt in dieser Hinsicht schon. Das statische Feld hält ein Objekt der String-Klasse mit dem Wert "". Wäre der String mutable passt es sogar ganz, aber der String ist eben nicht mutable - wie ich oben zeigte ;-)
Eine Instanz von String ändert sich - wegen immutable - sowieso nie.
Ich finde, schon, dass es wesentlich ist, dass "Empty" ein statisches Feld ist. Eine Klasse gilt als immutable, wenn man Instanzen der Klasse nach ihrer Erzeugung nicht mehr ändern kann. Marios Beispiel habe ich so verstanden, dass er zeigen wollte, dass sich das Empty-Feld der String-Klasse ändern läßt. Das gehört aber keiner Instanz von String, somit ändert er damit auch keinen String. Er weist nur einer Art globalen Variablen, die zufällig in der String-Klasse eingebaut ist, einen neuen String zu. [Fortsetzung folgt]
Bei einem hypothetischen nicht-statischen Feld von String würde hingegen typeof(string).GetField("SomeField").SetValue(someString, "HaHa"); die Instanz someString ändern.
"Empty" ist eine Instanz einer String-Klasse die Mario ändern probiert hat. Und das hat nicht geklappt, da diese nicht änderbar ist. Daher wurde eine neue Instanz der String-Klasse erstellt mit dem Wert "HaHa" und diese dem statischen Feld Empty der String-Klasse zugewiesen. Dass die Instanz der String-Klasse mit dem Wert "Empty" (ursprünglich) ein statisches Feld in der String-Klasse ist hat mE damit nix zu tun.
//Oder - Ergebnis zuweisen original = original.Replace("ABC", "XYZ");
D.h. im Beispiel: Auch durch Aufruf der Methode .Replace() wird der String 'original' nicht verändert. Es wird nur ein String zurückgegeben und diesen kannst du dann speichern. Natürlich kannst du den veränderten String dann wieder zuweisen.