Streit: call by value / call by reference

Jetzt hätte mich doch glatt interessiert um was es ging... finde aber nur "hat sich erledigt".... :mad:

Tipp: Drücke bitte auch auf den Button "Erledigt" unten links.
 
Mh ja, mir gings auch grad so wie dir FwDonnerbalken, aber zum Glück kann ich den originalen Beitrag ansehen. :D

port29, bitte unterlasse es deine Beiträge zu leeren! Wenn du eine Frage gestellt hast, die sich dann "von selbst" beantwortet hat, kannst du gerne die Lösung als neuen Beitrag anfügen, und danach das Thema als erledigt markieren!
 
Alex, was hältst du davon, wenn du dein Wissen mit uns teilst?! :D
Auch wenn es den Threadstarter nicht mehr interessiert, könnten wir ja zur Not philosophieren ;)
Was gibts da zu philosophieren :confused:
Im Grunde kommt es doch da drauf an was ich mit dem Objekt vor habe :confused:

Ich verwende meistens call by ref, achte allerdings da drauf das diese nicht zu sehr verwurzelt in ein ander sind damit der GC die Objekte auch wieder freigeben kann.

Call by Value kommt meistens zum tragen wenn die Objekte meist einen bestimmten Status repräsentieren sollen bei dem eine Referenz nicht von nöten ist.
Oder auch Kategorie Beschreibungen etc.

So hoffe ist klar was ich will, meine Heizung will irgendwie nicht warm werden und ich frier nen bissel, dazu tun noch meine Arme vom Training weh :(
 
Spyke: Es geht darum, was default in C# ist, und das ist nunmal "call by value". Deswegen gibts ja auch nur für call-by-reference ein Keyword. ^^ Bei Referenztypen (Objekte) aber bitte nicht vergessen, dass die Referenz kopiert wird, und damit auf das selbe Objekt zeigt. (Also das Objekt wird nicht kopiert)

Hier mal das Original für alle Neugierigen. ;)

port29 hat gesagt.:
Hallo,

ich habe gerade mit einem Arbeitskollegen einen Streit über call by value / call by reference. Ich vertrete die Meinung, dass C# per default call by value durchführt, er sagt, dass es immer call by reference ist.

Ich habe ihm ein paar Links geschickt, die meine Meinung bestätigen, den hier z.B.

Er hat mir dann ein paar (russische) Bücher auf den Tisch geknallt, wo genau das Gegenteil steht. Ich wollte deshalb jetzt genauer nachfragen, was denn jetzt bei einem Methodenaufruf passiert.

Angenommen ich habe jetzt folgenden Code:

Code:
MyClass foo= new MyClass();

Mit dem "new" belege ich den Speicher für ein neues Objekt der Klasse MyClass und weise die Adresse meines neuen Objektes der Variable "foo" zu. foo ist ein Pointer auf mein neues Objekt.

Code:
bar(foo);

Jetzt kommt der interessante Teil, denn was genau passiert hier?

1) Meine Meinung: Es wird ein neues Objekt der Klasse MyClass erzeugt. Der Speicherbereich des "alten" Objektes wird auf das neue Objekt geschrieben. Die Adresse des neuen Objektes landet in der Methodenvariable.

2) Meinung meines Kollegen: call by value bedeutet in C#, dass der Wert der Variable übergeben wird. Der Wert ist die Adresse. Also wird bei dem Funktionsaufruf nur die Adresse übergeben. Es wird die Referenz auf das Objekt als Wert übergeben.

Was ist nun richtig?
 
Ich denke, die unterschiedlichen Ansichten rühren daher, das beim Standardfall "call by value" zwar das Objekt selbst , aber nicht die von diesem Objekt referenzierten Objekte kopiert werden. Das ergibt dann wohl sowas wie eine gefühlte Übergabe "call by reference".

Gruß
MCoder
 
Ich denke, die unterschiedlichen Ansichten rühren daher, das beim Standardfall "call by value" zwar das Objekt selbst , aber nicht die von diesem Objekt referenzierten Objekte kopiert werden. Das ergibt dann wohl sowas wie eine gefühlte Übergabe "call by reference".

Gruß
MCoder

Ähm, nein. Wie Alex schon geschrieben hat, wird nur die Referenz kopiert, nicht das Objekt
 
Was ich meine, ist Folgendes:
Ein mit "call by value" übergebenes Objekt kann geändert werden (z.B. null setzen), ohne dass das Objekt außen davon betroffen ist. Es werden allerdings alle Veränderungen an inneren Objekten auch nach außen wirksam. Bei "call bei reference" dagegen bewirkt z.B. das Nullsetzen, dass das Objekt außen auch auf null gesetzt wird.
C#:
class MyClass
{
    public void func_value(Label o) 
    {
        o.Text = "123";
        o = null;
    }

    public void func_ref(ref Label o) 
    {
        o.Text = "123";
        o = null;
    }
}

...

Label A = new Label();
A.Text = "abc";

MyClass oMyClass = new MyClass();

// In diesem Methodenaufruf wird nur die Eigenschaft "Text" von A geändert
oMyClass.func_value(A); 
// Nach diesem Methodenaufruf ist A = null
oMyClass.func_ref(ref A) ;
Gruß
MCoder
 
Hi

Beim Setzen von null wird nur die Referenz auf das Objekt "gelöscht".
Übergibst du eine Objektreferenz an eine Methode, wird die Referenz (der Pointer) kopiert, nicht das Objekt. Das heißt, du hast 2 Referenz auf EIN Objekt. Setzt du eine oder auch beide Referenzen auf null ist das Objekt an sich weiterhin unverändert.

Bei Call-By-Reference wird die Referenz (der Pointer) von außen in die Methode übergeben. Das heißt es wird an beiden Stellen der gleiche Pointer genutzt. Das Objekt im Heap ist nur einmal referenziert.
 
Zurück