Ein Entwurfsmuster, bei dem ref
nützlich ist, ist ein bidirektionaler Besucher.
Angenommen, Sie verfügen über eine Storage
Klasse, die zum Laden oder Speichern von Werten verschiedener primitiver Typen verwendet werden kann. Es ist entweder in Load
Modus oder Save
Modus. Es hat eine Gruppe von überladenen Methoden namens Transfer
, und hier ist ein Beispiel für den Umgang mit int
Werte.
public void Transfer(ref int value)
{
if (Loading)
value = ReadInt();
else
WriteInt(value);
}
Es würde für andere primitive Typen ähnliche Verfahren sein - bool
, string
usw.
auf eine Klasse, dann das „übertragbar“ sein muss, können Sie eine Methode wie folgt schreiben würde:
public void TransferViaStorage(Storage s)
{
s.Transfer(ref _firstName);
s.Transfer(ref _lastName);
s.Transfer(ref _salary);
}
kann entweder das gleiche einzige Methode die Felder aus der Storage
laden, oder die Felder in die Storage
je speichern welchem Modus das Storage
Objekt befindet.
Wirklich, du listen nur alle Felder auf, die übertragen werden müssen, also nähert es sich der deklarativen Programmierung und nicht dem Imperativ. Das bedeutet, dass Sie nicht zwei Funktionen schreiben müssen (eine zum Lesen, eine zum Schreiben) und da das Design, das ich hier verwende, auftragsabhängig ist, ist es sehr praktisch, sicher zu sein, dass die Felder immer gelesen werden/in identischer Reihenfolge geschrieben. Der allgemeine Punkt ist, dass, wenn ein Parameter als ref
markiert ist, Sie nicht wissen, ob die Methode ihn lesen oder schreiben wird, und dies ermöglicht Ihnen, Besucherklassen zu entwerfen, die in einer von zwei Richtungen funktionieren , die auf symmetrische Weise aufgerufen werden soll (dh bei der besuchten Methode muss nicht bekannt sein, in welchem Richtungsmodus die Besucherklasse arbeitet).
Vergleich: + Attribute Reflection
Warum dies tun, anstatt die Felder zuzuschreiben und Reflexion unter Verwendung von automatisch das Äquivalent von TransferViaStorage
zu implementieren? Weil manchmal Reflexion langsam genug ist, um ein Engpass zu sein (aber immer Profil, um sicher zu sein - es ist fast nie wahr, und Attribute sind viel näher an das Ideal der deklarativen Programmierung).
Ich stimme der Idee zu, Wrapper-Typen zu erstellen, wenn es so aussieht, als würde das Konstrukt "Rückgabecode + Wert" ausgiebig in einem Projekt verwendet. –