2010-04-15 7 views
5

Gibt es eine Möglichkeit, das this-Schlüsselwort als ref-Argument zu erzwingen? Ich würde gerne einen Besucher übergeben, der mehrere Eigenschaften des Objekts ändert, aber dies möchte nur wie ein Wertparameter funktionieren.Verwenden Sie einen Ref-Parameter mit diesem Schlüsselwort?

-Code in Objekt:

public void Accept(Visitor<MyObject> visitor) 
{ 
    visitor.Visit(this); 
} 

-Code in Besucher:

public void Visit(ref Visitor<MyObject> receiver) 
{ 
    receiver.Property = new PropertyValue(); 
    receiver.Property2 = new PropertyValue(); 
} 

Antwort

10

Da Sie nicht wirklich ändern, was receiver bezieht sich auf es keine Notwendigkeit für die ref Schlüsselwort ist. Wenn dies jedoch der Fall wäre, könnten Sie this nicht auf eine andere Instanz verweisen.

Um this als ref Parameter zu übergeben, müssen Sie es wie folgt schreiben:

Visit(ref this); 

Dieser Code kompiliert nicht: „Kann nicht passieren‚<dieses>‘als ref oder out Argument, weil es schreibgeschützt ist "

+0

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

+0

@grefly: Nicht wenn "dies" eine Klasse ist. Sofern Sie die benutzerdefinierte Struktur (Werttypen) nicht "besuchen", ist ref nicht erforderlich. –

+0

Danke, Sie sind genau richtig! – grefly

5

Wenn Ihre Visitor<T> eine Klasse ist, dann brauchen Sie das Schlüsselwort ref nicht.

Alle Infos in einer Klasse wird automatisch geändert, wenn sie Sie wirklich brauchen, den Referee in einem Verfahren

+0

Das ist richtig - es tut mir leid, dass ich beides nicht als Antworten markieren kann. – grefly

0

Sie Stichwort geändert werden?

ref wäre nützlich, wenn Sie die Empfängerinstanz z. Empfänger = null;

sonst

receiver.Property ist zugänglich auch ohne Ref Stichwort

4

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.