Frage

Als ich anfing, C# zu verwenden, war ich mir nicht sicher, wie Referenzen genau behandelt wurden (ob sie als Wert übergeben wurden usw.).Ich habe fälschlicherweise angenommen, dass das Schlüsselwort „ref“ benötigt wird, wenn Objekte übergeben werden, die von der aufgerufenen Methode geändert werden.

Dann nach dem Lesen von Threads wie Das, Mir wurde klar, dass „ref“ nur benötigt wird, wenn Sie die eigentliche Referenz/den Zeiger selbst ändern müssen.

Aber heute bin ich auf ein Problem gestoßen, als ich einen Parameter über einen Remoting-Aufruf übergeben habe, bei dem ref tatsächlich benötigt wurde, um den Inhalt des Objekts zu ändern.Bei Übergabe ohne Referenz kam das Objekt unverändert zurück.Mir wurde gesagt, ich solle das Schlüsselwort ref hinzufügen, aber ich argumentierte eine Zeit lang, dass es nur notwendig sei, wenn man den Zeiger selbst ändere, nicht den Inhalt, auf den verwiesen wird.

Ich habe im Internet gesucht und konnte nur einen finden einzelne Seite das bespricht es kurz.Ist das ein bekanntes Problem und kann jemand auf eine Dokumentation dazu verweisen?Es scheint mir, dass ich ref jetzt für jeden Parameter verwenden muss, der über einen Remote-Aufruf geändert wird.

War es hilfreich?

Lösung

Hinzufügen „ref“ könnte, oder auch nicht helfen. Es hängt alles von der Schlauheit der jeweiligen Einweiser Umsetzung. Wenn Sie anrufen, zum Beispiel ein Web-Service, kein Betrag der „ref“ s werden Ihnen helfen - die Parameter der Funktion sind einfach nicht zurück über den Draht geschickt. Das einzige, was wieder aus dem Dienst kommt, ist der Rückgabewert der Funktion. Beim Umgang mit Remoting muss man (bis zu einem gewissen Grad zumindest) verstehen, wie die Dinge wirklich funktionieren - die Tatsache, dass Parameter serialisiert werden müssen und an den Angerufenen über eine Art „Draht“, am anderen Ende deserialisiert geschickt, Arbeit wird durch den Server und die Ergebnisse serialisiert und gesendet zurück zu Ihnen durchgeführt. Ob diese Ergebnisse Änderungen an den Parametern gehören Sie an erster Stelle geführt hängt mehr von der spezifischen Implementierung Remote, dann auf die „ref“ s, dass Sie fügen Sie Ihre Parameter dekorieren ...

Andere Tipps

Ich frage mich, warum Sie „Referenz/Zeiger“ gesagt haben.Es gibt einen großen Unterschied zwischen diesen Begriffen.Sehen Sie, ein Zeiger ist nur eine Adresse, sagen wir ein int.

Andererseits ist eine Referenz nichts anderes als ein Pseudonym für etwas.In Bezug auf C++:

int x;
int& y = x;

Von nun an gilt: Was auch immer mit x passiert, passiert auch mit y und umgekehrt, sie sind „für immer“ gebunden.

Auch hier in C++ ein Pass-by-Ref:

void foo(int& y);
int main(){
    int x = 0;
    foo(x);
}

Das bedeutet, dass y nur ein anderer Name (Alias) für x im Geltungsbereich von foo ist.Das ist es, was ref in C# bedeutet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top