Sie müssen Folgendes verwenden ref
wenn Sie den Parameter lesen und beschreiben wollen. Sie müssen out
wenn Sie nur schreiben wollen. In der Tat, out
ist für den Fall gedacht, dass Sie mehr als einen Rückgabewert benötigen, oder wenn Sie den normalen Rückgabemechanismus für die Ausgabe nicht verwenden wollen (was aber selten der Fall sein sollte).
Es gibt Sprachmechanismen, die diese Anwendungsfälle unterstützen. Ref
Parameter müssen initialisiert worden sein, bevor sie an eine Methode übergeben werden (wobei betont wird, dass sie schreibgeschützt sind), und out
Parameter können nicht gelesen werden, bevor ihnen ein Wert zugewiesen wurde, und es wird garantiert, dass am Ende der Methode auf sie geschrieben wurde (was die Tatsache unterstreicht, dass sie nur schreibbar sind). Ein Verstoß gegen diese Grundsätze führt zu einem Kompilierzeitfehler.
int x;
Foo(ref x); // error: x is uninitialized
void Bar(out int x) {} // error: x was not written to
Zum Beispiel, int.TryParse
gibt eine bool
und akzeptiert eine out int
Parameter:
int value;
if (int.TryParse(numericString, out value))
{
/* numericString was parsed into value, now do stuff */
}
else
{
/* numericString couldn't be parsed */
}
Dies ist ein klares Beispiel für eine Situation, in der Sie zwei Werte ausgeben müssen: das numerische Ergebnis und ob die Konvertierung erfolgreich war oder nicht. Die Autoren der CLR haben sich für die Methode out
hier, da sie sich nicht darum scheren, was die int
vorher gewesen sein könnte.
Para ref
können Sie sich ansehen Interlocked.Increment
:
int x = 4;
Interlocked.Increment(ref x);
Interlocked.Increment
inkrementiert atomar den Wert von x
. Da Sie lesen müssen x
um sie zu erhöhen, ist dies eine Situation, in der ref
angemessener ist. Es ist Ihnen völlig egal, was x
war, bevor sie an Increment
.
In der nächsten Version von C# wird es sogar möglich sein, eine Variable in out
Parameter, wodurch ihre reine Ausgabefunktion noch stärker betont wird:
if (int.TryParse(numericString, out int value))
{
// 'value' exists and was declared in the `if` statement
}
else
{
// conversion didn't work, 'value' doesn't exist here
}