Es klingt wie Sie eine Antwort auf Ihre Frage bereits größere bekam. Aber lassen Sie uns das trotzdem betrachten.
Gibt es eine Möglichkeit, das this-Schlüsselwort als Ref-Argument zu erzwingen?
Ja. Arbeite es logisch durch.
- A ref Argument macht eine alias für eine variable .
- „this“ keine Variable in einem Referenztyp ist
- „this“ eine Variable in einem Werttyp ist
- daher die einzige Möglichkeit, ein „this ref“ ist von einer Instanz Verfahren eines Werttypen passieren .
Und tatsächlich ist das, wie "dies" in einem Werttyp hinter den Kulissen implementiert wird. Wenn du eine (schlechteste Übung!nicht wirklich tun dies) wandelbaren Werttyp:
struct S
{
private int x;
public void M()
{
this.x = 123;
}
}
...
S s = new S();
s.M();
Da Instanzen von S Wert übergeben wie kommt es, dass M mutiert s? s muss als Referenz übergeben werden! In der Tat erzeugen den Code, den wir genauso, wenn Sie so etwas wie geschrieben haben:
struct S
{
private int x;
public static void M(ref S THIS)
{
THIS.x = 123;
}
}
...
S s = new S();
S.M(ref s);
Kurz gesagt, ein „this“ in einer Struktur bereits als ref Parameter übergeben wird, also kein Problem da ist es entlang vorbei nochmal. Dies ist fast immer eine schreckliche Idee, aber es ist legal.
Ja, Sie sind genau richtig. Aber ich möchte, dass die ursprüngliche Klasse die vom Besucher vorgenommenen Änderungen behält. Wenn ich nicht als ref passiere, dann ändere ich nicht nur die Eigenschaften einer * Kopie * von? –
grefly
@grefly: Nicht wenn "dies" eine Klasse ist. Sofern Sie die benutzerdefinierte Struktur (Werttypen) nicht "besuchen", ist ref nicht erforderlich. –
Danke, Sie sind genau richtig! – grefly