string - Verweistyp und Wertetyp
-
Hallo,
string ist doch auch Verweistyp. Warum erzeugt dann das
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class testclass { public string _t; public testclass(string t) { _t = t; } } class Program { static void Main(string[] args) { string str = "wwe"; testclass tc = new testclass(str); Console.WriteLine(tc._t); str = "222"; Console.WriteLine(tc._t); } } }
Diese Ausgabe:
wwe
wwe
?Warum ändert sich der String in der Klasse nicht nach str="222"?
C.
-
Weil System.String immutable ist.
-
Firefighter schrieb:
Weil System.String immutable ist.
Nein, das ist nicht der Grund. Dies trifft nur auf die Funktionen zu, welche alle so implementiert wurden, dass man den Inhalt von
String
nicht verändern kann.@Curtis Newton,
"222" und "wwe" sindstring
Objekte. Die Zuweisung ist nichts anderes als eine Referenzzuweisung. Du nimmst plötzlich an, dass die Zuweisung wie bei einem Wertetyp passieren soll und eine Kopie durchgeführt werden sollte. Das ist aber eben nicht der Fall. Wie du sagst, es ist ein Referenztyp.Grüssli
-
Dravere schrieb:
Firefighter schrieb:
Weil System.String immutable ist.
Nein, das ist nicht der Grund. Dies trifft nur auf die Funktionen zu, welche alle so implementiert wurden, dass man den Inhalt von
String
nicht verändern kann.@Curtis Newton,
"222" und "wwe" sindstring
Objekte. Die Zuweisung ist nichts anderes als eine Referenzzuweisung. Du nimmst plötzlich an, dass die Zuweisung wie bei einem Wertetyp passieren soll und eine Kopie durchgeführt werden sollte. Das ist aber eben nicht der Fall. Wie du sagst, es ist ein Referenztyp.Grüssli
Stimmt
Da war ich zu voreilig
-
Was müsste man ändern, damit das funktioniert? Nehmen wir an, man möchte eine String-Referenz als Member haben. Wie kann man das realisieren?
-
class Program { static void Main(string[] args) { string str = "wwe"; testclass tc = new testclass(str); Console.WriteLine(tc._t); tc._t = "222"; Console.WriteLine(tc._t); } }
-
löklökl schrieb:
Was müsste man ändern, damit das funktioniert? Nehmen wir an, man möchte eine String-Referenz als Member haben. Wie kann man das realisieren?
Am Besten spart man sich das, das trieft förmlich vor "C++"-denkweise
Aber man kann es so machen (kurz in LINQPad gehackt, deshalb freie Main-Funktion):
void Main() { StringBuilder sb = new StringBuilder(); sb.Append("www"); testclass tc = new testclass(ref sb); Console.WriteLine(tc._t.ToString()); sb.Append("222"); Console.WriteLine(tc._t.ToString()); } // Define other methods and classes here class testclass { public StringBuilder _t; public testclass(ref StringBuilder t) { _t = t; } }
Ausgabe:
www www222
-
@GPC,
Dasref
ist da gar nicht nötig. Dasref
wäre nur nötig, wenn du die übergebene Referenz verändern möchtest, also woraufsb
referenziert.
Also auch ohneref
referenzieren danach alleStringBuilder
Variablen auf das gleiche Objekt.Anonsten stimme ich dir zu, dass dies wohl eher ein falscher Ansatz ist und zu stark nach "C++" oder ähnliches riecht.
Grüssli
-
Dravere schrieb:
@GPC,
Dasref
ist da gar nicht nötig. Dasref
wäre nur nötig, wenn du die übergebene Referenz verändern möchtest, also woraufsb
referenziert.Ich weiß schon
Aber wenn schon Referenzierung, dann richtig