ref Argumente und C++ Unqiue Pointer



  • Hey Leute,

    Mal 'ne kurze Verständnisfrage bei einem Sachverhalt der mir eigentlich schon geläufig sein sollte.

    Das "passen" eines Argumentes an eine Methode in C# - wird das als Kopie oder Referenz geregelt? Ich weiss noch mager von C++ das wenn ich nicht explizit eine Adresse zur Object angegeben habe, ich nur eine Kopie überliefert habe.

    Grund für meine Sorge ist folgendes Tutorial zu der SFML API

    Unique pointers give us a lot of flexibility; we can basically pass around heavyweight
    objects without creating copies.

    Dort ist in C++ von Unique Pointern die Rede welche hier gut geeignet sind um heavyweight objects -> Texturen Objekte, Speichergünstig zu nutzen, da keine Kopie erstellt wird.

    Ich benutze die API mit .NET und somit muss ich einiges in C# umdenken - ist nicht so tragisch - jedoch möchte ich so Tutorial-nah wie möglich arbeiten.

    Nach einiger Google Recherche fand ich dann für C# das keyword "ref" - oft gehört, nie genutzt. Mein Problem ist es halt das ich bisher auch ohne "ref" Klassen welche als Argument übergeben wurden, verändern konnte. Ich habe also keine Kopie benutzt sondern schon das ursprünglich erstellte Objekt.
    Also ist doch im Grunde keine Kopie sondern die Adresse zum Object (demnach Pointer) übergeben worden.

    Wozu gibt es dann das keyword "ref". Geht es hier um die Stack bzw. Werte Typen - welche als Argument übergeben nicht implizit die Adresse sondern eine Kopie übermitteln?

    Wenn ja dann nordet mich bitte nochmal deutlich ein.
    Ich glaube meine Verunsicherung rührt einfach da her das bei C++ eine Referenz explizit für Klassen angegeben werden muss - das aber bei C# bei Heap Objekten jedoch implizit schon geschieht...

    Naja ich bin auf eure Antworten gespannt.

    Gruß Charlie



  • schau mal nach
    "c# referenztypen werttypen"



  • Falke88 schrieb:

    Das "passen" eines Argumentes an eine Methode in C# - wird das als Kopie oder Referenz geregelt?

    Der Wert wird als Kopie übergeben. Was genau das ist, der Wert, das hängt davon ab, ob du einen Werttypen oder einen Referenztypen vor dir hast. Bei einem struct wird z.B. das ganze struct kopiert, weil es ein Werttyp ist. Bei einer Klasse hast du immer nur eine Referenz auf eine im Heap liegende Instanz in der Hand, und nur diese wird -- als Kopie -- übergeben.

    Ich weiss noch mager von C++ das wenn ich nicht explizit eine Adresse zur Object angegeben habe, ich nur eine Kopie überliefert habe.

    Ja.

    Nach einiger Google Recherche fand ich dann für C# das keyword "ref" - oft gehört, nie genutzt.

    ref sorgt dafür, dass Argumente per Referenz übergeben werden.

    Mein Problem ist es halt das ich bisher auch ohne "ref" Klassen welche als Argument übergeben wurden, verändern konnte. Ich habe also keine Kopie benutzt sondern schon das ursprünglich erstellte Objekt.

    Halt, halt. Es wird sowieso (bei Referenztypen wie Klassen und Arrays) nicht das Objekt kopiert, sondern die Referenz darauf. Du kannst also selbstverständlich in der Methode das Objekt verändern. Was du nicht kannst, ist die Referenz verändern. Wenn du das willst, brauchst du ref.



  • Falke88 schrieb:

    Nach einiger Google Recherche fand ich dann für C# das keyword "ref" - oft gehört, nie genutzt. Mein Problem ist es halt das ich bisher auch ohne "ref" Klassen welche als Argument übergeben wurden, verändern konnte. Ich habe also keine Kopie benutzt sondern schon das ursprünglich erstellte Objekt.
    Also ist doch im Grunde keine Kopie sondern die Adresse zum Object (demnach Pointer) übergeben worden.

    Bei .NET werden reference types (= C# "class") normalerweise als Referenz übergebe und value types (= C# "struct" bzw. eingebaute Typen wie bool , int , ...) normalerweise als Wert.

    Falke88 schrieb:

    Wozu gibt es dann das keyword "ref". Geht es hier um die Stack bzw. Werte Typen - welche als Argument übergeben nicht implizit die Adresse sondern eine Kopie übermitteln?

    Mit ref gehst du einfache eine Ebene "weiter raus".
    D.h. bei reference types wird mit ref eine Referenz auf die Referenz übergeben, und bei value types eine Referenz auf das Objekt.

    Wobei man ref relativ selten braucht bzw. brauchen sollte.
    Eher noch out , aber auch das sollte man nicht in jeder zweiten Methode verwenden.

    void Foo(ref Bar bar, ref int i) // Sollte eigentlich 2x "out" sein statt "ref"
    {
        bar = new Bar();
        i = 23;
    }
    
    void Test()
    {
        Bar b = null;
        int i = 0;
        Foo(ref b, ref i);
        b.DoStuff(); // OK, wurde ja von Foo() befüllt
        Debug.Assert(i == 23);
    }
    


  • Okay Danke Jungs,

    Ihr habt mich wieder eingenordet 😉

    Ich verstehe jetzt keyword "ref" equivalent zum Operator "&" (adress of) aus C++ welchen man auch öfters anwenden kann um immer mehr in den Kern einer Referenz zu gelangen.
    Aka Pointer to Pointer usw.

    Danke für die große Hilfe Männers / Frauens


Log in to reply