wenn ich eine "struct" habe, die außer den üblichen Value-Typen einen String noch beinhaltet, wird der String bei einer Zuweisung der struct in eine andere Variable oder bei Übergabe als Parameter auch mitkopiert wie der Rest oder bleibt er als Referenz und ich habe dann immer den selben String statt einer Kopie?
Du hast immer den selben String, keine Kopie. Das ist auch ok so, denn Strings sind immutable - Du kannst einen String nicht ändern, Du kannst nur einen neuen String erzeugen und diese neue Referenz Deiner struct zuweisen.
Beachte aber den Unterschied zwischen "by value" und "by ref"-Aufrufen:
public struct S { public string value; }
public class X {
public static void Main() { S s; s.value = "vorher"; Console.WriteLine(s.value); //vorher ChangeV(s); Console.WriteLine(s.value); //vorher ChangeR(ref s); Console.WriteLine(s.value); //nachher }
public static void ChangeV(S s) { s.value = "nachher"; }
public static void ChangeR(ref S s) { s.value = "nachher"; }
das ist garnicht OK ;P ich wollte den String in einer Methode ändern und wenn ich das jetzt so machen würde, funktioniert mein Programm an einer anderen Stelle nicht mehr weil der String jetzt halt anders ist ;|
Der String ist nicht "anders", sondern es wird auf einen neuen String verwiesen - aber nur in der Kopie der struct, die Deine Methode benutzt. Es sei denn, Du rufst die Methode mit "ref". Ich habe meine Antwort um ein Beispiel ergänzt, hoffe das hilft.
Danke für die Blumen ;-) Zu beachten ist aber, dass es ein Beispiel für den Unterschied von ref- und value-Übergabe >>>bei structs<<< ist. Wäre S eine class, ergäbe auch schon die zweite Ausgabe "nachher".
vor mir bekommst auch Blumen ;] nun leider dein Beispielcode das Gegenteil davon beweist was du schreibst. der String wird doch kopiert beim Aufruf "by val" und das funktioniert genauso wie ich es wollte. der eigentliche Wert ändert sich dann nicht und das ist gut so... der Fall ist hirmit gelöst ;)