2010-06-01 4 views
6

Ich denke, es muss etwas tun, mit String als Referenztyp, aber ich verstehe nicht, warum einfach string.Replace("X","Y") nicht funktioniert?Warum string.Replace ("X", "Y") funktioniert nur, wenn es einer neuen Zeichenfolge zugewiesen wird?

Warum muss ich string A = stringB.Replace("X","Y") tun? Ich dachte, es ist nur eine Methode, die für eine bestimmte Instanz ausgeführt werden muss.

EDIT: Vielen Dank bis jetzt. Ich erweitere meine Frage: Warum funktioniert b+="FFF" funktioniert aber b.Replace nicht?

Antwort

0

String.Replace ist eine gemeinsame Funktion der String-Klasse, die eine neue Zeichenfolge zurückgibt. Es ist kein Operator für das aktuelle Objekt. b.Replace ("a", "b") wäre ähnlich wie eine Zeile, die nur c + 1 hat. Also genau wie c = c + 1 setzt den Wert von c + 1 tatsächlich auf c, b = b.Replace ("a", "b") setzt die neue Zeichenfolge, die an b zurückgegeben wird.

+3

Der Grund dafür ist, weil Zeichenfolgen unveränderlich sind, d. H. Sie können nicht geändert werden - Siehe @Kevin Antwort. Für mich ist es ein Fehler auf Microsofts Seite, da die Benennung der Methode irreführend ist. – James

+0

Was meinst du mit einem "String".Ersetzen ist eine gemeinsame Funktion "und" es ist kein Operator auf dem aktuellen Objekt "? –

+0

@ James, Strings sind unveränderlich, aber die Variablen nicht. Das OP scheint zu wissen, warum der Wert der Variablen nicht ist geändert, aber es ist die schlechte Benennungskonvention, die das Problem verursacht, nicht die Unveränderlichkeit der Strings. @Mark, schlechte Formulierung meinerseits.Ich wollte sagen, es verhält sich wie eine gemeinsame Funktion, nicht, dass es eine ist. Und wie eine Referenz Typ, es wirkt auf den referenzierten String, nicht auf den Verweis –

23

Weil Zeichenfolgen unveränderlich sind. Jedes Mal, wenn Sie eine Zeichenfolge ändern, erstellt .net creates ein neues Zeichenfolgenobjekt. Es ist eine Eigenschaft der Klasse.

Immutable objects
String Object

+0

+1: Dies ist der definitive Grund. Ich würde jedoch sagen, das eigentliche Problem ist die Benennung der Methode. Ersetzen bedeutet, dass das tatsächliche Objekt manipuliert wird. – James

16

Warum funktioniert stringA.Replace("X","Y") Arbeit?
Warum muss ich stringB = stringA.Replace("X","Y"); tun?

Da Zeichenfolgen in .NET unveränderlich sind. Sie können den Wert eines vorhandenen Zeichenfolgenobjekts nicht ändern, Sie können nur neue Zeichenfolgen erstellen. string.Replace erstellt eine neue Zeichenfolge, die Sie dann etwas zuweisen können, wenn Sie einen Verweis darauf behalten möchten. Aus der Dokumentation:

Gibt eine neue Zeichenfolge, in dem alle Vorkommen einer bestimmten Zeichenfolge in der aktuellen Instanz mit einem anderen bestimmten Zeichenfolge ersetzt werden.

Schwerpunkt meiner.


Also, wenn Strings unveränderlich sind, warum hat b + = "FFF"; Arbeit?

Gute Frage.

Bitte beachten Sie, dass b += "FFF";b = b + "FFF"; entspricht (außer dass b nur einmal ausgewertet wird).

Der Ausdruck b + "FFF" erstellt eine neue Zeichenfolge mit dem korrekten Ergebnis, ohne die alte Zeichenfolge zu ändern. Der Verweis auf den neuen String wird dann b zugewiesen, wobei der Verweis auf den alten String ersetzt wird. Wenn keine anderen Verweise auf die alte Zeichenfolge vorhanden sind, wird sie für die Garbage Collection verfügbar.

1

Ja, es ist eine Methode von System.String. Aber Sie können versuchen, a = a.Replace ("X", "Y");

3

Strings sind unveränderlich. Jede Operation, die sie ändert, muss eine neue Zeichenfolge erstellen.

6

Strings sind unveränderlich, was bedeutet, dass sie nach ihrer Erstellung nicht mehr geändert werden können. Dies hat mehrere Gründe, soweit ich weiß, hauptsächlich für die Leistung (wie Strings im Speicher dargestellt werden).

Siehe auch (unter vielen):

Als direkte Folge davon erzeugt jeder String-Operation ein neues String-Objekt. Insbesondere wenn Sie Dinge wie

foreach (string msg in messages) 
{ 
    totalMessage = totalMessage + message; 
    totalMessage = totalMessage + "\n"; 
} 

tun, erstellen Sie tatsächlich potenziell Dutzende oder Hunderte von String-Objekten. Wenn Sie also Strings differenzierter bearbeiten möchten, folgen Sie dem GvS-Hinweis und verwenden Sie den StringBuilder.

2

Ein StringBuilder unterstützt die Inline-Replace-Methode.

Verwenden Sie den StringBuilder, wenn Sie viel String-Manipulation durchführen müssen.

2

Warum "b + =" FFF "funktioniert, aber die b.replace ist nicht

Da der Operator + = die Ergebnisse zurück an den linken Operanden zu, natürlich. Es ist nur eine kurze Hand . für b = b + "FFF";

Die einfache Tatsache ist, dass Sie keine Zeichenfolge in .Net ändern Es gibt keine Instanzmethoden für Streicher -. Sie müssen immer die Ergebnisse eines Betriebs zurück in einen String Verweis zuweisen irgendwo

+2

Es gibt viele Instanzmethoden für die Zeichenfolge! http://msdn.microsoft.com/en-us/library/system.string_methods(v=VS.100).aspx Sie nur nie ihre Instanz mutieren. –

0

Wie alle oben gesagt haben, sind Strings unveränderlich.

Dies bedeutet, dass Sie beim Ersetzen eine neue Zeichenfolge erhalten, anstatt die vorhandene Zeichenfolge zu ändern.

Wenn Sie diese neue Zeichenfolge nicht in einer Variablen speichern (wie in der Variablen, für die sie deklariert wurde), wird Ihre neue Zeichenfolge nirgendwo gespeichert.

0

Um Ihre erweiterte Frage zu beantworten, ist b + = "FFF" gleichbedeutend mit b = b + "FFF", also erstellen Sie hier grundsätzlich auch einen neuen String.

0

Nur um expliziter zu sein. string.Replace ("X", "Y") gibt eine neue Zeichenkette zurück ... aber da Sie die neue Zeichenkette keinem Objekt zuweisen, ist die neue Zeichenkette verloren.

Verwandte Themen