Frage

Was sind die Dinge, die bei zwischen ByRef und ByVal wählen.

Ich verstehe den Unterschied zwischen den beiden, aber ich verstehe nicht ganz, wenn ByRef Ressourcen geschont oder wenn wir auch, dass etwa in der .NET-Umgebung kümmern müssen.

Wie kann man zwischen den beiden entscheiden, ob die Funktionalität in einer Situation keine Rolle spielt?

War es hilfreich?

Lösung

Es gibt eine Menge von Fehlinformationen rund um darüber. Die Hauptsache ist, dass Sie die Differenz zwischen Werttypen und Referenztypen verstehen, und der Differenz zwischen Pass von Wert und übergibt durch Bezugnahme .

Sie wollen fast immer von Wert zu übergeben. Übergabe als Referenz ist fast immer für „mehr als ein Ergebnis zurückkehren will, und zwar nicht nur durch die Dinge zu einer Liste hinzugefügt, die in übergeben wird.“ Das klassische Beispiel für ein Verfahren unter Verwendung von Pass-by-reference ist Int32.TryParse wobei der Rückgabewert ist ein Erfolg / Misserfolg, und der analysierten Wert von out-Parametern „zurückgegeben“ wird.

Andere Tipps

Der Standardwert ist byValue für alle Arten, aber es ist wichtig zu verstehen, was die beiden Optionen für einen „Referenz-Typen“ bedeuten (eine Klasse) in Bezug auf einen Werttyp entgegengesetzt. (Structs).

Für einen Referenztyp, wenn Sie einen Referenztyp Variable in einer Methode deklarieren, ist diese Variable ein Speicherplatz in dem Stapelrahmen des Verfahrens. Es ist nicht auf dem Heap. Wenn Sie diese Variable initialisieren (neu oder eine Fabrik mit, was auch immer), dann haben Sie ein aktuelles Objekt auf dem Heap erstellt, und die Adresse des Objekts in dem angegebenen Bezug Variable gespeichert in Ihrem Methode Rahmen stapelt.

Wenn Sie passieren einen Referenztyp zu einem anderen Verfahren byVal Sie sind eine Kopie der Adresse in der anrufenden gespeicherten Erstellen von Methoden stapeln und Leiten der Kopie des Wertes (der Zeigeradresse) an die aufgerufene Methode, wo es gespeichert wird in ein neuer Speicherschlitz in dem Stapel genannten Methoden. Innerhalb der aufgerufenen Methode, um die neuen geklonten variablen Punkte direkt das gleiche Objekt auf dem Heap. So verwenden, können sie die Eigenschaften des gleichen Objekts ändern. Aber man kann nicht ändern, die Haufen der ursprünglichen Referenzgröße Objekt (auf den Aufruf Methoden Stack) Punkte. Wenn in der aufgerufenen Methode Ich schreibe

  myVar = new object();

Die ursprüngliche Variable in der aufrufenden Methode wird nicht geändert zu einem neuen Objekt zeigen muß.

Wenn ich einen Referenztyp byRef passieren, OTOH, ich einen Zeiger auf die deklarierte Variable in der anrufenden Methoden vorbei stapeln (der auf dem Heap einen Zeiger auf das Objekt enthält) Es ist daher ein Zeiger auf einen Zeiger auf das Objekt . Er verweist auf den Speicherplatz auf dem anrufenden Methoden stapeln, die auf dem Heap auf das Objekt verweist.
So, jetzt, wenn ich den Wert der Variablen in der aufgerufenen Methode zu ändern, indem sie auf ein neues Objekt () einstellen, wie oben, da es sich um eine „refereence“ auf die Variable in der aufrufenden Methode ist, ich bin Wechsel tatsächlich dem Objekt die Variable in der aufrufenden Methode zeigt auf. So Nachdem die aufgerufene Methode zurückkehrt, wird die Variable in der aufrufenden Methode nicht mehr auf dem Heap auf die selbe Objekt zeigen werden.

ByVal sollte Ihr "Standard" sein. Verwenden Sie es, wenn Sie einen bestimmten Grund haben ByRef verwenden

ein Objekt ByVal in .net

Passing keine Kopie des Objekts macht und nicht verbraucht mehr Ressourcen dann ByRef wird ein Zeiger noch bis in die Funktion übergeben. Die Laufzeit gewährleistet nur, dass Sie nicht den Zeiger in Ihrer Funktion ändern und einen anderen Wert für sie zurück. Sie können noch Änderungen vornehmen, um die Werte innerhalb des Objekts, und Sie werden diese Änderungen außerhalb der Funktion sehen. Deshalb ByRef ist so selten verwendet. Es ist nur erforderlich, wenn Sie eine Funktion wollen das eigentliche Objekt ändern, die zurückkommt; damit ein Ausgabeparameter.

Verwenden Sie "ByRef" nur dann, wenn der Parameter "Ausgang" Parameter ist. Ansonsten verwenden „ByVal“. „ByRef“ auf Parametern, die Werte zurückgeben sollte nicht explizit gefährlich ist und Fehler einfach erzeugen kann.

Ich würde behaupten, dass ByRef sollte niemals verwendet werden -, dass es eine schlechte Praxis ist. Ich würde das auch zu dem typischen Anwendungsfall eine Funktion, um mehrere Werte zurückgeben (über BYREF Parameter) gilt. Es wäre besser für die Funktion eine strukturierte Antwort zurückzugeben, die diese mehrere Rückgabewerte enthält. Es ist klarer und deutlicher, wenn eine Funktion nur Werte über seine Rückkehr Anweisung gibt.

Kennzeichnung bestimmte Argumente als ByRef die Benutzer Ihrer Funktion zeigt, dass der Variable zugewiesen auf dieses Argument ** geändert werden. ****

Wenn Sie ByRef für alle args verwenden, werden es keine Möglichkeit, zu sagen, welche Variablen durch die Funktion geändert werden, und die durch sie gerade lesen. (außer in der Funktion Quelle von spähen!)

Laut Microsoft Wahl ByVal oder ByRef kann die Leistung für groß genug, um Werte beeinflussen (siehe Übergeben von Argumenten nach Wert und Referenz (Visual Basic) ):

  

Performance. Obwohl der Weiterleitungsmechanismus kann die Leistung beeinträchtigen   der Codes, ist der Unterschied in der Regel unerheblich. Eine Ausnahme   Dazu ist ein Werttyp ByVal übergeben. In diesem Fall Visual Basic   kopiert den gesamten Dateninhalt des Arguments. Daher für eine   großer Wert Typ, wie eine Struktur, kann es effizienter passieren   es BYREF.

[Hervorhebung hinzugefügt].

Sub last_column_process()
Dim last_column As Integer

last_column = 234
MsgBox last_column

trying_byref x:=last_column
MsgBox last_column

trying_byval v:=last_column
MsgBox last_column

End Sub

Sub trying_byref(ByRef x)
x = 345
End Sub

Sub trying_byval(ByRef v)
v = 555
End Sub

Viel Verwirrung werde ich versuchen, zu vereinfachen. Sie haben grundsätzlich vier Möglichkeiten:

  1. Geben Sie einen Wert Typ byVal
  2. Geben Sie einen Wert Typ byRef
  3. Führen Sie ein Objekt byVal
  4. Führen Sie ein Objekt byRef

Einige Leute sagen, man sollte nie byRef verwenden. Während sie technisch korrekt sind, ist eine Sache für bestimmte. Sie sollten NIE verwenden das Wort nie . Wenn Sie ein System von Grund auf neu entwerfen dann byRef sollte unter allen Umständen vermieden werden. Mit ihm macht einen Konstruktionsfehler. Jedoch arbeitet an einem bestehenden System nicht so viel Flexability bieten kann ein gutes Design zu implementieren. Manchmal müssen Sie consessions machen, das heißt byRef verwenden. Zum Beispiel, wenn Sie ein Update in 2 Tagen in getan byRef bekommen können mit dann mit zu vermeiden, dass kann vorteilhaft sein, das Rad neu zu erfinden und eine Woche nimmt nur byRef in die gleiche Verlegenheit erhalten.

Zusammenfassung:

  1. Mit byVal auf einen Werttyp: Übergibt einen Wert an eine Funktion. Dies ist die bevorzugte Art und Weise zu Design-Funktionen.
  2. Mit byRef auf einem Werttyp: Nützlich für mehr als einen Wert aus einer Funktion zurückkehrt. Wenn du schafft eine Funktion, die mehr als einen Wert zurückgeben muß, ein bestehendes System kann dies besser sein, als ein Objekt zu schaffen (und die Eigenschaften einstellen, und Entsorgung) nur für eine Funktion.
  3. Mit byVal auf ein Objekt: einen Zeiger eines Objekts zu einer Funktion. Die Funktion kann Ändern Sie das Objekt.
  4. Mit byRef auf ein Objekt: Übergibt einen Zeiger auf einen Zeiger eines Objekts zu einer Funktion. Erlaubt Ändern Sie das Objekt der Anrufer zeigt. Dies kann einige verursachen schwer Fehler zu finden und ich kann es von jedem guten Grund zu verwenden, nicht denken. Bedeutet nicht, gibt es nicht ein, aber wenn es sie gibt nur wenige und weit zwischen.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top