Ja - der Unterschied zwischen ref
und out
ist im Hinblick auf die eindeutige Zuordnung:
Ein out
Parameter nicht haben, auf jeden Fall durch den Anrufer vor dem Methodenaufruf zugeordnet werden. Es muss definitiv in der Methode zugeordnet werden, bevor es normal zurückkehrt (d. H. Ohne Ausnahme). Die Variable ist dann eindeutig im Aufrufer nach dem Aufruf zugeordnet.
Ein ref
Parameter muss vom Aufrufer vor dem Methodenaufruf eindeutig zugewiesen werden. Es nicht muss einen anderen Wert in der Methode zugewiesen werden.
Also nehmen wir an int.TryParse(string, out int)
ändern wollte ref
stattdessen zu verwenden. Normalerweise ist der Aufruf-Code sieht wie folgt aus:
int value;
if (int.TryParse(text, out value))
{
// Use value
}
else
{
// Do something else
}
Wenn wir nun ref
verwendet, würden wir value
Wert vor dem Aufruf geben, zum Beispiel:
int value = 0;
if (int.TryParse(text, ref value))
{
// Use value
}
else
{
// Do something else
}
Natürlich ist es kein riesige Unterschied - aber es gibt den falschen Eindruck. Wir geben einen Wert zu, den wir nie verwenden werden, und das ist nicht gut für die Lesbarkeit. Ein out
Parameter zeigt an, dass ein Wert aus der Methode herauskommen wird (vorausgesetzt es gibt keine Ausnahme) und dass Sie keinen Wert haben müssen, um damit zu beginnen.
Einmal die Vorschläge, die ich für C# 5 gemacht habe (ich habe keine Ahnung, ob es übernommen wird oder nicht) ist, dass eine Methode mit einem out
Parameter als eine Methode betrachtet werden kann, die ein Tupel zurückgibt von Werten. In Kombination mit einer besseren Unterstützung für Tupel, das würde bedeuten, wir so etwas tun könnte:
var (ok, value) = int.TryParse(text);
In diesem Fall ok
und value
würden jeweils bool
und int
implizit eingegeben werden. Auf diese Weise ist klar, was in die Methode (text
) und was herauskommt (zwei Informationen: ok
und value
).
, die einfach nicht zur Verfügung stehen würde, wenn int.TryParse
stattdessen einen ref
Parameter - wie der Compiler kann nicht wissen, ob es sich um den Anfangswert des ref
Parameter tatsächlich Pflege geht.
NB: Ich habe gerade [diese Antwort] (http://stackoverflow.com/questions/4102892/real-world-examples-where-c-out-parameters-are-useful/7220754#7220754) an Eine ähnliche Frage, bei der ich ein Szenario beschreibe, in dem ein out-Parameter für etwas anderes nützlich ist als die Rückgabe von mehr als einem Wert aus einer Methode. – stakx