| 

.NET C# Java Javascript Exception

1
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?
31.03.2011
pinchbeck 373 7
2 Antworten
2
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";
}

}
31.03.2011
Matthias Hlawatsch 8,4k 2 8
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 ;|
pinchbeck 31.03.2011
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.
Matthias Hlawatsch 31.03.2011
das ist eine feine, einfache erklärung für den unterschied zwischen referenz und wert übergabe.
nabuchodonossor 31.03.2011
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".
Matthias Hlawatsch 31.03.2011
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 ;)
pinchbeck 31.03.2011
0
Wenn du aber eine Kopie von diesem String brauchst, warum erstellst du dir keine ;)
31.03.2011
Voi 191 3
warum Code schreiben wenn .NET das selbst machen kann und wie es sich herausgestellt hat, macht .NET das auch.
pinchbeck 31.03.2011

Stelle deine .net-Frage jetzt!