Pass eine ref
wenn Sie ändern möchten, was das Objekt ist:
TestRef t = new TestRef();
t.Something = "Foo";
DoSomething(ref t);
void DoSomething(ref TestRef t)
{
t = new TestRef();
t.Something = "Not just a changed t, but a completely different TestRef object";
}
Nach DoSomething Aufruf nicht t
nicht auf die ursprüngliche new TestRef
beziehen, sondern bezieht sich auf ein ganz anderes Objekt.
Dies kann auch nützlich sein, wenn Sie den Wert eines unveränderlichen Objekts, z. a string
. Sie können den Wert eines string
nicht ändern, nachdem es erstellt wurde. Wenn Sie jedoch eine ref
verwenden, können Sie eine Funktion erstellen, die die Zeichenfolge für eine andere ändert, die einen anderen Wert hat.
Edit: Wie andere Leute erwähnt haben. Es ist keine gute Idee, ref
zu verwenden, wenn es nicht benötigt wird. Mit ref
gibt die Methode Freiheit, das Argument für etwas anderes zu ändern, müssen Aufrufer der Methode codiert werden, um sicherzustellen, dass sie diese Möglichkeit behandeln.
Wenn der Parametertyp ein Objekt ist, fungieren Objektvariablen immer als Referenzen auf das Objekt. Das heißt, wenn das Schlüsselwort ref
verwendet wird, haben Sie einen Verweis auf eine Referenz. Dies ermöglicht Ihnen, Dinge zu tun, wie im obigen Beispiel beschrieben. Aber, wenn der Parametertyp ein Grundwert (zB int
) ist, dann, wenn dieser Parameter auf innerhalb der Methode zugeordnet ist, wird der Wert des Arguments, die übergeben wurde in wird nach der Methode zurück geändert werden:
int x = 1;
Change(ref x);
Debug.Assert(x == 5);
WillNotChange(x);
Debug.Assert(x == 5); // Note: x doesn't become 10
void Change(ref int x)
{
x = 5;
}
void WillNotChange(int x)
{
x = 10;
}
Unabhängig davon, ob Sie einen Verweis oder einen Werttyp übergeben, wird das Standardverhalten als Wert übergeben. Sie müssen nur verstehen, dass bei Referenztypen der übergebene Wert * eine Referenz ist. Dies ist nicht das Gleiche wie die Übergabe * durch * Verweis. –