[C#] Parameterübergabe "Call by Value"
-
Hallo,
ich bekomm gleich einen Heulkrampf.
Wie ich aus der grottigen MSDN-Hilfe zu C# entnommen habe, scheint die Standardeinstellung bei der Parameterübergabe "Call by Value" zu sein.Aber irgendwas mache ich falsch, da meine Methoden alles "Call by Reference" behandeln.
Mein Code:
using System; class BSP { private static void Ausgabe(string[] datenfeld) { int i; for(i=1;i<datenfeld.Length;i++) { Console.WriteLine(datenfeld[i]); } } private static void BubbleSort(string[] datenfeld) { int i,j; for(i=1;i<datenfeld.Length;i++) { for(j=1;j<i;j++) { if(String.Compare(datenfeld[i],datenfeld[j])<0) { datenfeld[0] = datenfeld[i]; datenfeld[i] = datenfeld[j]; datenfeld[j] = datenfeld[0]; datenfeld[0] = ""; } } } Ausgabe(datenfeld); } public static void Main() { string[] strUrfeld = {"","Spongebob","Gary","Tadaeus","Patrick","Sandy","Plankton"}; BubbleSort(strUrfeld); Console.WriteLine(""); Ausgabe(strUrfeld); } }
Ausgabe in der Konsole:
Gary Patrick Plankton Sandy Spongebob Tadaeus Gary Patrick Plankton Sandy Spongebob Tadaeus
Ich erwarte eigentlich, dass bei der zweiten Ausgabe die Ursprungsreihenfolge ausgebenen wird. Ist bestimmt wieder eine Kleinigkeit ... *grrrrrrrrr*
Besten Dank schonmal.
-
Ich weiß ja nicht genau was Du vor hast, aber warum machst Du es nicht so:
using System; class BSP { private static void Ausgabe(string[] datenfeld) { foreach(string elem in datenfeld) Console.WriteLine(elem); } public static void Main() { string[] strUrfeld = {"","Spongebob","Gary","Tadaeus","Patrick","Sandy","Plankton"}; string[] astr = new string[strUrfeld.Length]; strUrfeld.CopyTo(astr, 0); Array.Sort(astr); Ausgabe(astr); Console.WriteLine(""); Ausgabe(strUrfeld); } }
-
Ich spiele eigentlich nur rum, um C# besser kennen zu lernen.
(Sonst hätte ich direkt Quicksort genommen
Daher mag Dein Beispiel funktionieren, mir aber nicht helfen, das Problem zu verstehen.Wenn die MSDN sagt:
using System; public class MyClass { public static void TestRef(ref char i) { i = 'b'; } public static void TestNoRef(char i) { i = 'c'; } public static void Main() { char i = 'a'; // variable must be initialized TestRef(ref i); // the arg must be passed as ref Console.WriteLine(i); TestNoRef(i); Console.WriteLine(i); } } Ausgabe: b b
Dann muss es doch bei mir auch gehen, da ich im Prinzip doch nichts anders mache als die Prozedur "TestNoRef" ...
-
Ich dachte ein Array wird als Zeiger übergeben und das wird wohl auch der Grund sein warum es nicht funktioniert.
-
Übrigens, C#-Code kann in die Tags [ cs] und [ /cs] (statt cpp) geschrieben werden... dann sind auch alle Schlüsselwörter eingefärbt.
Nur zur Info.
-
Wertetypen:
Primitive Datentype = Call by Value
Referenztypen:
Array und Objekte = Call by Reference
-
Wenn man eine Referenz by Value übergibt, dann manipuliert man eben das Objekt, auf das die Referenz verweist. Und
Foo bar;
erzeugt nunmal eine Referenz auf Foos unter dem Namen bar.
-
Achso, also Arrays sind Referenzen.
Das erklärt dann einiges.Vielen Dank.
-
Helium schrieb:
Wenn man eine Referenz by Value übergibt, dann manipuliert man eben das Objekt, auf das die Referenz verweist. Und
Foo bar;
erzeugt nunmal eine Referenz auf Foos unter dem Namen bar.
damit hat man keine Referenz !!!