2010-08-10 11 views
19

Ziemlich geradlinig. MSDN gibt an, dass Sie ref, aber nicht für partielle Methoden verwenden können. Ich bin nur neugierig auf die warum? Es war mein Verständnis, dass, wenn Code kompiliert wird, die Partialtöne zusammengeführt werden, also was ist mit der Einschränkung? Gibt es mehr zu partial als nur Code-Dateien sauberer und organisiert (d. H. Eyecandy)?C# Warum können partielle Methoden ref verwenden, aber nicht?

Referenz: MSDN Article - "Teilmethoden können ref, aber nicht out Parameter haben."

Antwort

20

Sie müssen überlegen, was passiert, wenn die partielle Methode nicht implementiert ist.

Was passiert dann ist, dass alle Aufrufe an die Methode nur ausgezogen werden, als ob sie nie passiert wäre.

Also für ein Verfahren unter Verwendung, wäre es wie folgt aussehen:

stream s; 
GetStream(out s); 
s.Write(...); 

und kompiliert werden, als ob es sagte dazu:

stream s; 
s.Write(...); 

Dieser Code ist nicht erlaubt, weil s nicht gewesen initialisiert. Die Garantie, dass die Variable zu dem Zeitpunkt initialisiert wird, an dem Sie versuchen, die Methode Write aufzurufen, wurde mit dem Aufruf an GetStream verknüpft.

Dasselbe gilt für Methoden, die Daten zurückgeben. Da der gesamte Methodenaufruf nur dann nicht kompiliert wird, wenn Sie die partielle Methode nicht implementiert haben, müssen Sie überlegen, was Sie tun können und was nicht, und den Code, der sie aufruft, unverändert lassen. In Bezug auf out und Rückgabewerte hat es die Möglichkeit, den aufrufenden Code ungültig oder unvollständig zu lassen, so dass es nicht erlaubt ist.

Was ref, das ist gültig, da die Initialisierung Pflege durch den anrufenden Code genommen wurde:

stream s = null; 
GetStream(ref s); // may be stripped out 
if (s != null) 
    s.Write(...); 
+2

Gut erklärt! – AlwaysAProgrammer

9

Im Gegensatz zu ref-Parametern MÜSSEN out-Parameter initialisiert werden, bevor die Methode zurückkehrt. Wenn die partielle Methode nicht implementiert ist (was ein gültiges Szenario ist), wie kann sie initialisiert werden?

+0

und nicht initialisierter Werttyp ist in C# -Compiler nicht zulässig. Gute Erklärung – kokabi

4

Meine Schätzung wäre, weil out Parameter nicht initialisiert werden müssen, während ref Parameter tun.

Wenn Sie einen out Parameter für eine partielle Methode verwendet haben, wie konnte C# überprüfen, ob der Parameter initialisiert wurde oder nicht?

4

Ein out Parameter schlägt vor, dass Sie einen Wert aus der Methode möchten. Wenn die Methode nicht existiert, kann sie diesen Wert nicht bereitstellen.

Die Alternative wäre, den Variablenwert explizit auf den Standardwert (0, null usw.) zu setzen, anstatt den Methodenaufruf auszuführen. Auf diese Weise wird die Variable immer noch definitiv initialisiert - obwohl der Standardwert möglicherweise nicht sehr nützlich ist. Ich glaube, dass das C# -Team dies berücksichtigt hat - es könnte sogar eine zukünftige Version schaffen, wer weiß? Persönlich bezweifle ich, dass es besonders nützlich wäre, aber die Möglichkeit ist da.

Für den Moment könnten Sie stattdessen immer einen ref Parameter verwenden und die Variable vor dem Aufruf einfach initialisieren, was auch immer der Standardwert sein sollte.

1

ich der Grund annehmen würde, weil ein Teil-Verfahren mit nur einer Signatur (dh keine Umsetzung) Ist noch gültig. Wenn Sie einen out-Parameter hätten, würde eine implementierungslose Methode immer einen Fehler verursachen (da es nichts gibt, was den out-Wert zuweist)

1

Eine partielle Methode wird auf Teilklassen aufgeteilt. Eine Methode ist erforderlich, um einem OUT-Parameter einen Wert zuzuweisen. Partielle Methoden können implementiert werden oder nicht. Es würde bedeuten, dass mehrere Code-Blöcke versuchen, dem OUT-Parameter einen Wert zuzuweisen.

1

Wie alle anderen angegeben haben, müssen out Parameter zugewiesen werden. Um dies hinzuzufügen, wird Compiler-Fehler CS0177ref auf der anderen Seite muss vor dem Anruf erstellt werden.

Verwandte Themen