3 Stimmen

C# - Ref Typ Vergleich zu Zeigern Verwirrung?

Ich lese Jeffrey Richters CLR über C#, und darin sagt er mit ref-Parameter der Verweis selbst wird durch Wert übergeben. Dies macht Sinn für mich und scheint analagous zu Zeigern.

D.h. in C, wenn ich einen Zeiger in eine Funktion übergebe und dann den Zeiger über malloc zuweise, ändert sich der Zeiger, um auf den neuen Speicherplatz zu zeigen, aber ich weiß, da der Zeiger selbst eine Kopie ist, dass er den ursprünglichen Zeiger, der an die Funktion übergeben wurde, nicht neu zuweist. Um eine Änderung des Zeigers außerhalb der Funktion zu erreichen, muss ich einen Doppelzeiger verwenden.

In C#:

void Swap(ref Object a, ref Object b)
{
    Object t = b;
    b = a;
    a =t ;
}

funktioniert. Das deutet für mich darauf hin, dass Verweise nicht wertbezogen sind. In Analogie zum obigen malloc nehme ich an, dass ich ein Objekt per Referenz übergeben und ihm ein neues Objekt zuweisen könnte und die Neuzuweisung außerhalb der Funktion bestehen bleiben würde.

Kann jemand meine Verwirrung aufklären?

6voto

Anthony Pegram Punkte 119149

Sie haben einen kleinen Fehler. Mit Referenztypen die Referenzen sind nach Wert übergeben . Übergabe einer ref Parameter ist anders. Unter

private void Frob(Foo foo) // Foo is a class
{

}

Eine Kopie des Verweises auf das Objekt vom Typ Foo an der Aufrufstelle in die Methode übergeben wird Frob . Diese Kopie der Referenz wird als Wert übergeben. Dieser Verweis und der Verweis an der Aufrufstelle verweisen auf dasselbe Objekt im Speicher, und zwar so lange, bis einer der beiden Verweise auf einige andere Objekt im Speicher. Wenn wir zum Beispiel innerhalb dieser Methode Folgendes schreiben

foo = someOtherFoo;

Dann bezieht sich der Parameter nicht mehr auf dasselbe Objekt wie das Objekt an der Aufrufstelle. Der Verweis auf die Aufrufstelle lautet unverändert .

Betrachten wir nun, ob wir die ref Stichwort.

private void Frob(ref Foo foo)
{
    foo = someOtherFoo;
}

In dieser Situation, foo ist ein alias der Variablen an der Aufrufstelle. Diese Variablen zeigen nicht nur auf dasselbe Objekt im Speicher, es ist, als ob sie dieselbe Variable wären! Infolgedessen ist das Zeigen foo a someOtherFoo wird sich nicht nur verändern foo innerhalb dieser Methode, so wird diese Änderung auch an der Aufrufstelle berücksichtigt.

5voto

Mitch Wheat Punkte 287474

Ohne die ref Schlüsselwort wird die Referenz eines Objekts als Wert übergeben.

Mit dem ref Schlüsselwort wird ein Verweis auf eine Objektreferenz als Wert übergeben.

[es ist nur so, dass der Compiler die Tatsache verbirgt, dass die Zuweisung an einen Parameter, der durch explizite ref verändert den Zeiger]

0voto

Marino Šimić Punkte 7256

Beim Aufruf wird der ursprüngliche Zeigerwert (die Referenz) übergeben

void Swap(ref Object a, ref Object b)
{
    Object t = b;
    b = a;
    a = t;
}

Damit wird eine Kopie des ursprünglichen Zeigers übergeben:

void Swap(Object a, Object b)
{
    Object t = b;
    b = a;
    a = t;
}

Beide verweisen auf dasselbe Objekt, aber die Änderung des zweiten Objekts wird nicht in einem größeren Bereich als dem dieser Methode reflektiert...

Allerdings verstehe ich die Frage nicht ganz...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X