Die übergabe von Objekten per Referenz vs-Wert
Ich will einfach nur, um zu überprüfen, mein Verständnis von C#'s Möglichkeiten, Dinge zu behandeln, bevor ich Tauchen Sie zu tief in die Gestaltung meiner Kurse. Mein Aktuelles Verständnis ist, dass:
Struct
ist ein Wert Typ, was bedeutet, es enthält tatsächlich die Daten-member definiert.-
Class
ist ein Referenz Typ, was bedeutet, es enthält Verweise auf die Daten-member definiert. -
Einer Signatur der Methode übergibt die Parameter von Wert, was bedeutet, dass eine Kopie des Werts übergeben wird, die innerhalb der Methode, so dass es teuer für große arrays und Datenstrukturen.
- Eine Methodensignatur definiert einen parameter mit dem ref oder aus keywords wird stattdessen ein parameter übergeben werden, die von Referenz, was bedeutet, dass ein Zeiger auf das Objekt bereitgestellt wird, statt.
Was ich nicht verstehe, ist, was passiert, wenn ich eine Methode aufgerufen wird, was tatsächlich passiert. Hat neuen() get aufgerufen? Macht es einfach automatisch kopieren Sie die Daten? Oder kommt es eigentlich nur auf das ursprüngliche Objekt? Und wie funktioniert mit ref und aus beeinflussen Sie diese?
- Sind Sie Fragen, was passiert Werttypen oder Referenztypen?
- Beide, denke ich. Aber Avi ' s Antwort unten zu haben scheint beide Fälle abgedeckt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die kurze Antwort:
Den leeren Konstruktor wird nicht automatisch aufgerufen werden, und es eigentlich nur Punkte auf das ursprüngliche Objekt.
mit ref und out nicht beeinflussen.
Die lange Antwort:
Ich denke, es wäre einfacher zu verstehen, wie C# Griffe übergeben von Argumenten an eine Funktion.
Eigentlich alles übergeben wird von Wert
Wirklich?! Alles, was von Wert?
Ja! Alles!
Natürlich muss es irgendeine Art von Unterschied zwischen der Weitergabe Klassen und einfache typisierte Objekte wie Integer, ansonsten wäre es ein Riesen Schritt zurück, was Leistung und Performance betrifft.
Naja die Sache ist die, dass hinter die kulissen, wenn Sie übergeben eine Instanz der Klasse eines Objekts an eine Funktion, was ist wirklich an die Funktion übergeben wird, ist der Zeiger auf die Klasse. die Zeiger können natürlich durch Wert übergeben werden, ohne dass performance-Probleme.
Eigentlich, alles wird durch Wert übergeben; es ist nur so, dass, wenn
Sie sind "die übergabe eines Objekts", bist du eigentlich der übergabe einer Referenz auf das
Objekt (und schon sind Sie vorbei, die reference-by-value).
einmal sind wir in die Funktion, angesichts der argument-pointer, wir können beziehen sich auf das Objekt übergeben durch Verweis.
Sie nicht wirklich brauchen, etwas zu tun für diese, können Sie sich direkt auf die Instanz übergeben als argument (wie gesagt, dieser ganze Prozess geschieht hinter den kulissen).
Nach dem Verständnis dieser, Sie wahrscheinlich verstehen, dass der leere Konstruktor wird nicht automatisch aufgerufen werden, und es eigentlich nur Punkte auf das ursprüngliche Objekt.
BEARBEITET:
Als der aus und ref, Sie ermöglichen die Funktionen zum ändern des Wertes eines arguments, und die änderung bestehen außerhalb des Geltungsbereichs der Funktion.
In einer nussschale, das ref-Schlüsselwort für den Wert-Typen wie folgt zu handeln:
übersetzen in c++:
während das weglassen der ref wird einfach übersetzen:
mithilfe dieser keywords für Referenz Typ Objekte, können Sie Speicher neu zuzuteilen, um das übergebene argument und machen die Umschichtung bestehen außerhalb des Geltungsbereichs der Funktion (weitere details entnehmen Sie bitte den MSDN-Seite)
Seite beachten:
Der Unterschied zwischen ref und out ist, das macht Sie sicher, dass die aufgerufene Funktion muss einen Wert zuweisen, die out-argument, während der ref hat diese Einschränkung nicht, und dann sollte man es handhaben durch Zuweisung einige default-Wert selbst, so, ref Bedeutet, das der erste Wert des Arguments ist wichtig für die Funktion und könnte es beeinflussen das Verhalten.
what is really being passed to the function is the pointer
) aber nie weniger, wird der Anruf bei einem call-by-value von der Adresse.Übergabe eines Wert-Typ-variable an eine Methode übergeben Sie eine Kopie der Variablen an die Methode. Änderungen der parameter in der Methode haben keinen Einfluss auf die ursprünglichen Daten in der Variablen gespeichert.
Wenn Sie möchten, dass die genannte Methode ändern Sie den Wert des Parameters, den Sie haben, um es zu übergeben, die durch Verweis, mit dem ref-oder out-Schlüsselwort.
Wenn Sie an einem Referenz-Typ-parameter durch den Wert, ist es möglich, die Daten zu ändern, auf den der Verweis, wie der Wert einer Klasse member. Jedoch, Sie können ändern Sie den Wert der Referenz selbst; das heißt, Sie können nicht die gleiche Referenz, um Speicher für eine neue Klasse habe und es bestehen außerhalb des Blocks. Um das zu tun, übergeben Sie die parameter mit Hilfe der ref (oder aus) - Schlüsselwort.
Referenz: Die Übergabe Von Parametern(C#)
Tragisch, es gibt keine Möglichkeit, ein Objekt übergeben, von dem Wert in C# oder VB.NET. Ich schlage vor, statt Sie passieren, zum Beispiel, New Class1(Objekt1) wo Objekt1 ist eine Instanz von Class1. Sie müssen schreiben Sie Ihre eigene Neue Methode, dies zu tun, aber zumindest haben Sie dann eine einfache pass-by-value-Funktion für Class1.