Laden...

out-Schlüsselwort bei Übergabe von Klassen

Erstellt von christof.k vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.914 Views
C
christof.k Themenstarter:in
159 Beiträge seit 2005
vor 17 Jahren
out-Schlüsselwort bei Übergabe von Klassen

Hallo,

ich habe eine Frage bezüglich Funktionsdeklarationen:

Ich habe eine Klasse myClass (die hauptsächlich eine Sammlung von Daten ist) welche ich als Parameter an eine Funktion übergeben möchte, welche diese dann auch Verändert.

Da Klassen ja per Referenz übergeben werden, kann ich diese eh ändern (denke ich).
Kann / soll ich diese dann im Funktionskopf explizit als "out" deklarieren oder ist das in diesem Fall egal / falsch?

Vielen Dank
Christof

P
70 Beiträge seit 2006
vor 17 Jahren

Also out ist fast das gleiche wie ref mit den einzigen Unterschied das die Variablen vor der Übergabe nicht initalisiert sein müssen. Das ist dann Sinnvoll wenn jemand deine Methode benutzt du aber nicht weißt ob er eine initalisierte Variable nimmt oder nicht.

Grüße

plucked

6.862 Beiträge seit 2003
vor 17 Jahren

Du musst unterscheiden zwischen Referenztypen und Wertetypen. Um Wertetypen zu verändern in Funktionen musst du mit ref/out übergeben, da du dann die Referenz erhälst. Bei Referenztypen erhälst du mit ref/out aber die Referenz auf die Referenz auf das Objekt, damit du die Referenz auf das Objekt auch ändern kannst. Das ist in deinem Fall aber nicht nötig. Es reicht einfach dein Referenztyp zu übergeben und du kannst das Objekt worauf er verweist normal ändern.

Baka wa shinanakya naoranai.

Mein XING Profil.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo christof.k,

als langgedientes Mitglied solltest du erst einen Blick auf Artikel und FAQ verwerfen: C# und Übergabemechanismen: call by value vs. call by reference 🙂

herbivore

C
christof.k Themenstarter:in
159 Beiträge seit 2005
vor 17 Jahren

Herbivore,

danke für den dezenten Hinweis 🙂)
Das ist die Antwort.....Ich sollte doch öfters mal in die FAQ schauen....

Aber eine Frage bleibt noch:
Wenn ich also eine Klasse ohne ref übergebe, heißt es ja, eine neue Referenz wird erzeugt und der gesamte Klasseninhalt wird dahinkopiert.
Je nach Umfang der Klasse kann das ja schonmal was Zeit/Resourcen kosten.
Sollte ich also (auch wenn ich nicht vor habe, die Originalklasse zu verändern), das ref Schlüsselwort verwenden?

Vielen Dank
Christof

6.862 Beiträge seit 2003
vor 17 Jahren

Original von christof.k
Wenn ich also eine Klasse ohne ref übergebe, heißt es ja, eine neue Referenz wird erzeugt und der gesamte Klasseninhalt wird dahinkopiert.

Nein. Du bringst da was durcheinander. Eine Referenz ist einfach nen Verweis auf ein bestimmtes Objekt im Speicher. Wenn du nun die Referenz übergibst wird die kopiert ja, verweist aber auf das gleiche Objekt. Die Nutzdaten an sich werden also nicht kopiert. Von daher hast du durch die normale Referenzübergabe keine Performanceprobleme.

Baka wa shinanakya naoranai.

Mein XING Profil.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo talla,

verweist aber auf das gleiche Objekt.

verweist aber auf dasselbe Objekt! Ich denke damit wird es noch klarer.

herbivore

6.862 Beiträge seit 2003
vor 17 Jahren

Danke für diese Spitzfindigkeit 🙂

Baka wa shinanakya naoranai.

Mein XING Profil.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo talla,

so spitzfindig finde ich das gar nicht. Wenn man über mögliches Kopieren von Objekte redet, ist 'dasselbe' und 'das Gleiche' eben genau der Unterschied, ob kopiert wird oder nicht.

obj2 = obj1;

obj2 und obj1 zeigen auf dasselbe Objekt.

obj2 = obj1.Clone ();

obj2 und obj1 zeigen auf das Gleiche, aber nicht dasselbe Objekt.

herbivore

C
christof.k Themenstarter:in
159 Beiträge seit 2005
vor 17 Jahren

Ok....dann habe ich das Beispiel nicht ganau genug gelesen.

D.h. in meinem Fall könnte ich den Inhalt des Objektes verändern, aber die Referenz nicht auf ein anderes Objekt "umlenken"....

Danke für die klärenden Worte!

Christof

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo christof.k,

D.h. in meinem Fall könnte ich den Inhalt des Objektes verändern, aber die Referenz nicht auf ein anderes Objekt "umlenken"....

genau so ist es.

herbivore