2017-07-20 3 views
0

Dies wurde wahrscheinlich schon einmal gefragt, aber ich kann es nicht finden. Ich glaube nicht, dass mein Googlefu gut genug ist. Wie auch immer,Eine String-Manipulation auf eine Variable anwenden, ohne die Variable = auf das Ergebnis zu setzen?

Sagen, ich habe dies:

string cat = "meow" 
cat = cat.replace("meow","purr"); 
cat = Regex.Replace(cat, "purr", "Meow!"); 

Es Extra scheint die Katze Variable auf eine manipulierte Kopie davon zu setzen. Gibt es eine Möglichkeit, dies in einem Ref-Weg zu tun, so dass ich die Variable nicht auf die modifizierte Version von selbst setzen muss?

Um klar zu sein, es ist Zeilen 2 und 3 oben, die ich hier fragen.

EDIT: Ich glaube nicht, die marked dupe ist ein EXAKT dupe meiner Frage. Meine Frage ist spezifisch für die Untersuchung der Existenz einer solchen Sache. Der verlinkte Beitrag ist spezifisch für eine Erklärung, warum er NICHT existiert. Für diejenigen, die mit dem unveränderlichen Konzept nicht vertraut sind, lohnt sich diese Frage wahrscheinlich noch.

+0

Sie direkt verwenden können 'cat = cat.replace (" miau "," Miau! ")'. Ich denke, das Beispiel ist nicht gut. Willst du fragen, wie man zwei Strings vertauscht, ohne eine temporäre Variable zu erzeugen? –

+0

@ WiktorStribiżew Nur mehrere Fälle, wo Sie die Variable auf sich selbst stellen. Kein Endspielziel mit dem obigen Code. : P –

Antwort

2

In C# sind Strings unveränderbar. Dies bedeutet, dass Sie einen Zeichenfolgenwert, auf den sich eine Variable bezieht, nicht sicher ändern können. dh es gibt keine Methode, die wie folgt aussieht:

string cat = "meow"; 
cat.replace("meow", "purr"); 
Console.WriteLine(cat); // expected "purr", but output is still "meow" 

Sie Wrapper-Methoden für jede der String-Operationen schreiben könnten Sie eine Variable mutieren wollen, wie:

void replace(ref string value, string regex, string replaceString) { 
    value = value.replace(regex, replaceString); 
} 

und verwenden Sie es mögen:

replace(cat, "meow", "purr"); 

ABER, tun Sie das nicht. Es ist unordentlich und nicht zu halten. Methoden für jede der String-Operationen, die Sie ausführen möchten, zu erstellen, nur damit Sie die Illusion von String-Mutabilität erreichen können, ist keine gute Übung.

können Sie versuchen, StringBuilder stattdessen verwenden, die aussehen würde:

string cat = "meow"; 
StringBuilder stringBuilder = new StringBuilder(cat); 
stringBuilder.Replace("meow", "purr"); 
Console.WriteLine(stringBuilder.ToString()); 
+0

Emphase auf unveränderlich –

+0

Perfekte Antwort danke. Erklärt auf der perfekten Ebene und jetzt weiß ich, was unveränderlich bedeutet! –

+0

Dies ist nicht ganz richtig, da Zeichenfolgen in einer unsicheren Weise geändert werden können: https://stackoverflow.com/questions/32464944/can-you-change-the-contents-of-a-immutable-string-via-an- unsafe-method – JuanR

1

Aus der Dokumentation:

Da Strings unveränderlich sind, ist es nicht möglich ist (ohne unsicheren Code zu verwenden) Ändern Sie den Wert eines Zeichenfolgenobjekts, nachdem es erstellt wurde. Es gibt jedoch viele Möglichkeiten, den Wert einer Zeichenfolge zu ändern und das Ergebnis in einem neuen Zeichenfolgenobjekt zu speichern.

Was Sie jedoch tun, ist die Klasse String verwenden:

StringBuilder builder = new StringBuilder(); 
builder.Append("Juan"); 
builder.Replace("Juan", "Javier"); 
Console.WriteLine(builder.ToString()); //This outputs "Javier" 

Stringbuilder können Sie auch die Zeichenfolge auf Zeichenebene mit einem Index ändern:

builder[0] = 'X'; 
Console.WriteLine(builder.ToString()); //This outputs "Xavier" 
+0

hmmm, irgendwelche down-Seiten zu String Builder? Warum verwenden Sie 'String' über' StringBuilder'? –

+0

@CapnJack: Der Unterschied ist genau das, was Sie wollen. StringBuilder existiert für Situationen wie diese, in denen Sie KEINE neuen Instanzen erstellen möchten. Da StringBuilder einen internen Zeichenpuffer verwaltet, können Sie Änderungen vornehmen, ohne neue Instanzen zu erstellen. – JuanR

+0

@ CapnJack: Dies ist kein Problem für eine kleine Anzahl von Operationen, aber wenn Leistung ist von größter Bedeutung und Sie haben Millionen von ihnen, einen Puffer (die übrigens auf eine bekannte Größe initialisieren können) wird sehr nützlich und viel leistungsfähiger. – JuanR

Verwandte Themen