2012-03-26 16 views
8

Ich habe zwei Methoden:C# Passing Referenzart direkt vs out-Parameter

public void A(List<int> nums) 
{ 
    nums.Add(10); 
} 

public void B(out List<int> nums) 
{ 
    nums.Add(10); 
} 

Was ist der Unterschied zwischen diesen beiden Anrufe?

Im Allgemeinen versuche ich, den Unterschied zwischen bestandenen Referenztypen wie Ist- oder Out-Parameter zu verstehen.

Antwort

0

Das Schlüsselwort out bewirkt, dass Argumente als Referenz übergeben werden. Dies ist ähnlich wie das ref-Schlüsselwort, außer dass ref erfordert, dass die Variable initialisiert wird, bevor sie übergeben wird. Um einen out-Parameter zu verwenden, müssen sowohl die Methodendefinition als auch die aufrufende Methode explizit das Schlüsselwort out verwenden. Zum Beispiel:

http://msdn.microsoft.com/en-us/library/t3c3bfhx(v=vs.80).aspx

6

In Ihrem Beispiel Methode B wird nicht kompilieren, weil ein out Parameter nicht initialisierten betrachtet wird, so dass Sie es initialisieren, bevor Sie es verwenden können. Auch wenn ein Verfahren mit einem out Parameter aufrufen, müssen Sie die out Schlüsselwort an der Aufrufstelle angeben:

B(out numsB); 

Und Sie brauchen nicht auf die numbsB Variable vor dem Aufruf zu initialisieren, da es überschrieben wird durch die Methode.

Jon Skeet einen großen Artikel hat, die die verschiedenen Möglichkeiten erläutert, Parameter zu übergeben: Parameter passing in C#

0

In der Version B hat die Funktion der direkten Zugriff auf die Variable. Es ist wie das Schlüsselwort 'ref', außer dass die Variable innerhalb der Funktion, die den Parameter übernimmt, zugewiesen werden muss. Sie können mehrere Werte aus einer Funktion zurückgeben. Und die Aufrufsyntax ist 'B (out numsB);'

3

Ein non-ref, non-out-Parameter bezeichnet wie eine lokale Variable einen Speicherort. Wenn der Typ des Speicherortes ein Referenztyp ist, enthält der Speicherort einen Verweis auf eine Instanz dieses Typs.

Ref und Out-Parameter hingegen halten einen Verweis auf einen Speicherort. Dieser Speicherort kann eine lokale Variable, ein Feld oder ein Array-Element sein. Mit anderen Worten, Ref- und Out-Parameter führen zu einer anderen Indirektionsebene. Wenn Sie in einer Methode einen ref- oder out-Parameter vom Typ reference haben, handelt es sich um eine Referenz auf einen Verweis auf ein Objekt.

Warum möchten Sie einen Verweis auf einen Verweis auf ein Objekt? Falls Sie den Verweis auf das Objekt ändern müssen (im Gegensatz zum Ändern des Objekts selbst).

Dies ist eine nützliche Technik in einigen engen Umständen.Zum Beispiel können Sie eine Funktion schreiben, die zwei Warteschlangen je nachdem, welche bestellt hat den kleineren Wert auf:

void OrderQueues(ref Queue<int> a, ref Queue<int> b) 
{ 
    if (a.Peek <= b.Peek) return; 
    var temp = a; 
    a = b; 
    b = temp; 
} 

Out Parameter sind nützlich, wenn Sie mehr als einen Wert von einer Methode zurückgeben möchten:

Meiner Erfahrung nach sind Ref- und Out-Parameter ziemlich selten und bei Referenztypen sogar noch seltener.

Beachten Sie, dass ein Ref-Parameter vom Aufrufer initialisiert werden muss, während ein Out-Parameter vom Aufrufer initialisiert werden muss. Wenn Sie dem ref-Parameter niemals einen Wert zuweisen, sollte es wahrscheinlich ein "normaler" Parameter sein. Wenn Sie einem out-Parameter niemals einen Wert zuweisen, wie in Ihrem Beispiel, wird Ihr Code nicht kompiliert.