C # Übergabe des Referenztyps direkt vs Parameter

8

Ich habe zwei Methoden:

%Vor%

Was ist der Unterschied zwischen diesen beiden Anrufen?

%Vor%

Im Allgemeinen versuche ich, den Unterschied zwischen übergebenen Referenztypen als Ist- oder als Out-Parameter zu verstehen.

    
Davis Dimitriov 26.03.2012, 15:50
quelle

4 Antworten

6

In Ihrem Beispiel kann die Methode B nicht kompiliert werden, weil ein out -Parameter als nicht initialisiert betrachtet wird. Sie müssen ihn initialisieren, bevor Sie ihn verwenden können. Wenn Sie eine Methode mit einem out -Parameter aufrufen, müssen Sie außerdem das Schlüsselwort out am Aufrufort angeben:

%Vor%

Und Sie müssen die Variable numbsB vor dem Aufruf nicht initialisieren, da sie von der Methode überschrieben wird.

Jon Skeet hat einen großartigen Artikel, der die verschiedenen Möglichkeiten zum Übergeben von Parametern erklärt: Übergabe von Parametern in C #

    
Thomas Levesque 26.03.2012 15:52
quelle
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 dagegen enthalten 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 sollten Sie einen Verweis auf eine Referenz auf ein Objekt haben? 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 Situationen. Zum Beispiel möchten Sie vielleicht eine Funktion schreiben, die zwei Warteschlangen anordnet, je nachdem, welche den kleineren Wert oben hat:

%Vor%

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

%Vor%

Meiner Erfahrung nach sind ref- und out-Parameter ziemlich selten und bei Referenztypen 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.

    
phoog 26.03.2012 23:37
quelle
0
  

Das Schlüsselwort out bewirkt, dass Argumente als Referenz übergeben werden. Das ist   ähnlich wie das Schlüsselwort ref, außer dass ref die Variable erfordert   vor der Weitergabe initialisiert werden. Um einen out-Parameter zu verwenden, müssen sowohl der   Methodendefinition und die aufrufende Methode muss explizit das out verwenden   Stichwort. Zum Beispiel:

Ссылка

    
Royi Namir 26.03.2012 15:51
quelle
0

In Version B hat die Funktion 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 lautet 'B (out numbsB);'

    
Flaise 26.03.2012 15:52
quelle

Tags und Links