C # Perché i metodi parziali usano ref, ma non out?

Abbastanza diretto. MSDN afferma che è ansible utilizzare ref, ma non per metodi parziali. Sono solo curioso del perché ? Ho capito che quando il codice è compilato, i partial vengono uniti, quindi cosa succede con la restrizione? C’è qualcosa di più che partial semplice creazione di file di codice più puliti e organizzati (ad es. Eyecandy)?

Riferimento: articolo MSDN – “I metodi parziali possono avere parametri di rif, ma non out .”

Devi considerare cosa succede se il metodo parziale non è implementato.

Quello che succede allora è che tutte le chiamate al metodo sono semplicemente spogliate come se non fossero mai accadute.

Quindi, per un metodo che usa, sembrerebbe questo:

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

ed essere compilato come se dicesse questo:

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

Questo codice non è consentito perché s non è stato inizializzato. La garanzia che la variabile verrebbe inizializzata nel momento in cui si tenta di chiamare il metodo Write su di essa era legata alla chiamata a GetStream .

È lo stesso con i metodi che restituiscono i dati. Poiché l’intera chiamata al metodo non è compilata se non hai implementato il metodo parziale, devi considerare cosa puoi o non puoi fare e lasciare comunque il codice che lo chiama valido. In termini di valori di out e return, ha il potenziale di lasciare il codice chiamante non valido o incompleto, quindi non è permesso.

Per quanto riguarda ref , ciò è valido poiché l’inizializzazione è stata gestita dal codice chiamante:

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

Perché diversamente dai parametri ref, i parametri out DEVONO essere inizializzati prima che il metodo ritorni. Se il metodo parziale non è implementato (che è uno scenario valido), come può essere inizializzato?

La mia ipotesi sarebbe perché out parametri out non devono essere inizializzati mentre i parametri ref fanno.

Se si è utilizzato un parametro out su un metodo parziale, in che modo C # può verificare che il parametro sia stato inizializzato o no?

Un parametro out suggerisce di volere un valore fuori dal metodo. Se il metodo non esiste, non può fornire quel valore.

L’alternativa sarebbe quella di impostare il valore della variabile esplicitamente sul suo valore predefinito (0, null ecc.) Invece di eseguire la chiamata al metodo. In questo modo, la variabile sarebbe ancora definitivamente inizializzata, anche se il valore predefinito potrebbe non essere terribilmente utile. Credo che il team C # abbia preso in considerazione questo: potrebbe persino trasformarlo in una versione futura, chi lo sa? Personalmente dubito che sarebbe particolarmente utile, ma c’è la possibilità.

Per il momento, puoi sempre usare un parametro ref , e solo inizializzare la variabile manualmente prima della chiamata a qualunque valore di default dovrebbe essere.

Suppongo che il motivo sia perché un metodo parziale con solo una firma (cioè nessuna implementazione) è ancora valido. Se avessi un parametro out, un metodo di implementazione-less causerebbe sempre un errore (poiché non c’è nulla che assegni il valore out)

Un metodo parziale è suddiviso tra classi parziali. È necessario un metodo per assegnare un valore a un parametro OUT. I metodi parziali possono o non possono essere implementati. Significa che più blocchi di codice stanno tentando di assegnare un valore al parametro OUT.

Come tutti gli altri hanno dichiarato, out param devono essere assegnati. Per aggiungere questo verrà generato errore del compilatore CS0177 ref d’altra parte deve essere assegnato prima di effettuare la chiamata.