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
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
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.
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
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
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.
Hallo talla,
verweist aber auf das gleiche Objekt.
verweist aber auf dasselbe Objekt! Ich denke damit wird es noch klarer.
herbivore
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
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
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