Best practice: ref-parameter oder return-Wert?
Eigentlich mache ich eine Liste als Referenz-parameter wie folgt:
public static List ListMethod(List result)
Sah ich einige Leute, die auch in dieser Hinsicht:
public static void ListMethod(ref List result)
Wenn ich mich nicht falsch, "meine" Methode nimmt auch die list
als Referenz-parameter, und Sie sollten in der Lage sein, es zu benutzen, genauso wie "andere" in seiner Methode.
Aber es scheint mehr "sauber" zu mir, dass Sie einen parameter einzugeben, tun Sie etwas mit ihm und zurück in die Methoden Rückgabewert.
Irgendwelche guten Argumente, die für oder gegen eine Methode oder die andere?
Es ist eine Liste? warum senden Sie es per ref was ist es, das Sie zu erreichen versuchen?
Mit out übergeben, wie ref/out, intern einen Verweis auf heap-Kopie auf stack-und, dass die an die aufgerufene Methode. Wenn verwendet, ref, die die gleiche Referenz wird als argument übergeben.
Warum Sie denken, Sie brauchen, um wieder eine
Natürlich, wenn die Liste selbst ist einfach nur mutiert dann weder die Rückgabe oder die ref ist erforderlich. Allerdings, wenn Sie zuweisen eine völlig neue Liste der parameter, dann wird entweder eine Rückkehr oder ref ist nötig, um die angerufenen um die Veränderung zu sehen. Jedoch, wie bereits erläutert, gibt es Unterschiede zwischen Rückkehr und ref, auch wenn das Ergebnis scheint das gleiche zu sein.
Dieses einfache Beispiel sollte machen u verstehen pastebin.com/sm8niPRD gleiche wie das, was jon skeet sagt.
Mit out übergeben, wie ref/out, intern einen Verweis auf heap-Kopie auf stack-und, dass die an die aufgerufene Methode. Wenn verwendet, ref, die die gleiche Referenz wird als argument übergeben.
Warum Sie denken, Sie brauchen, um wieder eine
List
in Ihre erste Methode, und nicht alles zurückzugeben, was in der zweiten?Natürlich, wenn die Liste selbst ist einfach nur mutiert dann weder die Rückgabe oder die ref ist erforderlich. Allerdings, wenn Sie zuweisen eine völlig neue Liste der parameter, dann wird entweder eine Rückkehr oder ref ist nötig, um die angerufenen um die Veränderung zu sehen. Jedoch, wie bereits erläutert, gibt es Unterschiede zwischen Rückkehr und ref, auch wenn das Ergebnis scheint das gleiche zu sein.
Dieses einfache Beispiel sollte machen u verstehen pastebin.com/sm8niPRD gleiche wie das, was jon skeet sagt.
InformationsquelleAutor Dorababu Meka | 2011-11-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist wahrscheinlich, dass Sie nicht brauchen, um verwenden
ref
- aber es ist einen Unterschied.In der Regel, wenn ich sehe Menschen, die mit
ref
für den Typ der Referenz-Parameter, es ist, weil Sie nicht verstehen, wie die Parameterübergabe funktioniert. Aber wenn deine Methode hat, so etwas wie dieses:dann im ersten Fall wird der Anrufer nicht sehen, die änderung, während im zweiten Fall, der Aufrufer eine variable geändert werden, um auf das neue Objekt verweisen.
Siehe meine Artikel über die übergabe von Parametern für viel mehr Details.
InformationsquelleAutor Jon Skeet
Nein, Ihre Methode nicht verwenden
ref
parameter. Der Standardwert istpass by value
.Der Unterschied ist, dass Ihre Methode kann nur ändern, den Inhalt Ihrer Liste, aber nicht die Referenz der parameter
result
Punkte zu.Was ist der beste Ansatz? Es hängt davon ab, was die Methode tun soll.
Wenn Ihr Verfahren modifiziert die Liste oder gibt neue Daten, sollten Sie den Rückgabewert verwenden.
Seine viel besser zu verstehen, was dein code tut, als mit einem ref-parameter.
Weiterer Vorteil der Rückgabewerte ist die Fähigkeit zur Nutzung der Methode der Verkettung.
Können Sie code schreiben, wie diese, die Pässe der list-parameter von einer Methode zur anderen:
return result;
ist nicht sehr teuer in Bezug auf entweder LOC, CPU oder Komplexität, und machen Ihnen das Leben viel einfacher für die Funktion der Verbraucher.InformationsquelleAutor Jan
Wenn Sie einfach wieder eine Liste, sollten Sie immer zuerst verwenden, da es zeigt, dass die Absicht.
Die version mit
ref
sagt mir, dass ich anfangen kann mit einer Liste, und Ihre Methode ändern, die Liste, die ich geschickt, oder sogar ändern Sie es mit einem anderen. Wenn das Eure Absicht ist, zu tun.Aber wenn die Methode immer gibt eine neue Liste zurück, verwenden Sie einen return-Wert statt einem ref-parameter.
Ein Hinweis auf der Seite: könnten Sie
out
stattref
zu zeigen, Ihren Absichten der Rückkehr eine neue Liste, aber das ist nur eine gute Praxis, wenn Sie mit der return-Wert für etwas anderes.InformationsquelleAutor Arjan Einbu
Einer Sache Besondere über ref-Parameter ist hier, dass - "Eine variable übergeben mit der ref muss zugewiesenen Wert zuerst.". Also, wenn Sie wollen, machen es zu streng für die aufrufende Methode Wert zuweisen, bevor Sie den Anruf, den Sie wahrscheinlich können ref-Parameter.
InformationsquelleAutor Jsinh