[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 !!!


Anmelden zum Antworten