Warum hat C # sowohl out als auch ref?

18

C # hat die Schlüsselwörter outund ref. Warum werden diese beiden benötigt? Haftungsausschluss: Ich habe keine fundierten Kenntnisse in C #.

Neo
quelle
3
Gibt es nicht ein standortübergreifendes Duplikat für Stack Overflow?
Peter Mortensen
2
Fragen Sie nach dem Unterschied zwischen refund out? Oder fragen Sie sich, wie die Verwendung von Argumenten mit Bezug auf ref/ outim Vergleich zu Argumenten mit Bezug auf / (kein Modifikator für den Parameter) ist? Oder beides?
Jeppe Stig Nielsen
1
Ich denke, diese Frage ist ähnlich, aber nicht ganz falsch - zumindest wenn es aus Sicht des
Sprachdesigns

Antworten:

32

In Bezug auf die Implementierung sind sie im Wesentlichen dasselbe, outkommunizieren jedoch etwas, was refnicht der Fall ist: Sie interessieren sich nicht für Eingaben. Dies bedeutet bestimmte Dinge für Sie und für das Werkzeug. Sie können beispielsweise eine nicht initialisierte Variable an einen outParameter übergeben, und dies ist kein Problem, wo dies sonst der Fall wäre. Innerhalb der Funktion müssen Sie dem outParameter einen Wert zuweisen, bevor er zurückgegeben wird, wohingegen es nicht erforderlich ist, etwas zu tun alle mit einem refWert.

Mason Wheeler
quelle
10
Ref vs out ist für den Compiler weitaus wichtiger als für einen Programmierer. Der Compiler muss sicherstellen , dass Sie eine Variable nicht lesen, bevor ihr ein Wert zugewiesen wird, und outgibt ihm eine Möglichkeit, dies zu tun, die besser dazu passt, wie Sie mit den Variablen umgehen möchten.
Cort Ammon - Reinstate Monica
Könnten Sie bitte etwas näher erläutern: 'out' kommuniziert etwas, was 'ref' nicht kommuniziert.
Neo
4
@Neo: Grundsätzlich, was ich in der Antwort gesagt habe: Es zeigt an, dass es Ihnen egal ist, dies für die Eingabe zu verwenden, und daher ist es sicher, einen nicht initialisierten Wert an einen outParameter zu übergeben, da die empfangende Funktion ihn nicht lesen wird .
Mason Wheeler
@MasonWheeler Ist dies jedoch vom Prüfer erlaubt (und / oder auf der Empfängerseite durchgesetzt)? Out ist intern nur ein Attribut.
Random832
@ Random832: Als Robert geschrieben unter seiner Antwort, haben Sie einen Blick auf Eric Lippert (ehemals C # Compiler Typ) diskutieren diese bei stackoverflow.com/q/2876315
Mason Wheeler
7

Um diese beiden Schlüsselwörter zu verstehen, müssen Sie verstehen, was das Übergeben eines Werts als Referenz bedeutet. Im Wesentlichen bedeutet dies, dass wenn Sie die in der Methode oder Funktion übergebene Parametervariable ändern , diese Variable ihren geänderten Wert behält, wenn Ihre Funktion beendet wird. Wenn Sie einen Parameter als deklarieren refoder outdies ausführen , behält eine normale Parametervariable ihren ursprünglichen Wert bei, auch wenn Sie ihn in der Funktion geändert haben.

Der einzige Unterschied zwischen refund outbesteht darin, dass outSie die Variable nicht initialisieren müssen, bevor Sie sie an die Funktion übergeben ref. während out tut man etwas auf die Variable innerhalb der Funktion zuweisen erfordern, aber refnicht der Fall.

Robert Harvey
quelle
Gibt es keinen Unterschied in Bezug auf die Varianz?
Monocell
Siehe Eric Lipperts Antwort auf stackoverflow.com/q/2876315
Robert Harvey
2

Du hast gefragt.

C # muss raus und ref, warum diese beiden benötigt werden. Ich habe keine fundierten Kenntnisse in C #. Warum sind Out- und Ref-Parameter erforderlich?

Und die Antwort ist, dass sie nicht ERFORDERLICH sind, Java hat zum Beispiel auch nicht und VB hat nur ref (und benötigt es nur in der Methodendeklaration).

Sie können problemlos ein gesamtes Programm schreiben, ohne eines von beiden zu verwenden.

Sie existieren, weil sie gelegentlich nützlich sind. Aus diesem Grund gibt es zwei und nicht nur einen - denn es ist nützlich, zu unterscheiden zwischen "Hier ist etwas, ändern Sie es, wenn Sie möchten" und "Geben Sie diesem Ding einen neuen Wert".

Andere Sprachen haben andere Prioritäten und können diese oder gleichwertige enthalten oder auch nicht. Sie können sich sogar nicht darüber einig sein, ob eines von beiden nützlich ist, und können sich daher aktiv dafür entscheiden, das eine oder das andere NICHT zu implementieren.

jmoreno
quelle
1

In ihrem Kern beide refund outbietet einen Mechanismus für das Bestehen der Adresse einer Variablen auf ein Verfahren , so dass es aktualisiert werden kann - die Zuordnung zu der refoder outParametern aktualisieren die Variable im Kontext des Anrufers. Wo sie sich unterscheiden, ist in den Garantien: outGarantiert, dass die Variable aktualisiert wird,ref nicht.

Auf der anderen Seite des Anrufs gibt es ähnliche Unterschiede. Es outist nicht garantiert, dass ein Parameter unserer Methode bei der Ankunft irgendetwas Nützliches enthält, und er muss irgendwann auf einen Wert gesetzt werden, während aref davon ausgegangen werden kann, dass Parameter einen Wert hat, und wir müssen nichts Spezifisches damit tun.

Dieser Unterschied wirkt sich auf die Code-Analyse, -Erstellung und -Optimierung aus, die zwar für uns die meiste Zeit nicht so offensichtlich ist, sich jedoch auf die Funktionsweise unserer Programme auswirken kann. Der Codegenerator kann die Zuweisung der Variablen bis unmittelbar vor dem Aufruf aufschieben. Der Optimierer entscheidet möglicherweise, dass er bestimmte Vorgänge auf der Grundlage des Vertrags usw. effektiver neu anordnen kann.

In Bezug auf die Verwendung: In der Regel verwende ich diese outOption in Situationen, in denen mir der Inhalt der Variablen nicht wichtig ist, wenn sie als Parameter eingeht und refwenn ich dies tue.

Corey
quelle