Domanda

piuttosto semplice. MSDN afferma che è possibile utilizzare ref, ma non per i metodi parziali. Sono solo curioso di vedere il perché ? E 'stato la mia comprensione che quando il codice viene compilato, i parziali sono fuse, quindi qual è il passo con la restrizione? C'è di più per partial di un semplice fare file di codice più pulito e organizzato (cioè eyecandy)?

Riferimento: MSDN articolo - "I metodi parziali può avere ref ma non fuori parametri ".

È stato utile?

Soluzione

Hai avuto modo di considerare che cosa succede se il metodo parziale non è implementato.

Quello che succede poi è che tutte le chiamate al metodo è solo spogliato fuori come se fossero mai successo.

Quindi, per un metodo che utilizza fuori, sarebbe simile a questa:

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

ed essere compilato come se ha detto questo:

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

Questo codice non è consentito perché s non è stato inizializzato. La garanzia che la variabile sarebbe stata inizializzata con il tempo si tenta di chiamare il metodo Write su di esso era legato con la chiamata a GetStream.

E 'lo stesso con i metodi di restituzione dei dati. Dal momento che l'intera chiamata al metodo non è solo compilato se non si è implementato il metodo parziale, è necessario considerare che cosa si può e non può fare e ancora lasciare il codice che chiama valida. In termini di valori out e ritorno, ha il potenziale di lasciare il codice chiamante non valido o incompleto, per cui non è consentito.

Per quanto riguarda ref, che è valida dal momento che l'inizializzazione è stata curata dal codice chiamando:

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

Altri suggerimenti

A causa parametri ref differenza, fuori parametri devono essere inizializzati prima che il metodo restituisce. Se il metodo parziale non è implementato (che è uno scenario valido) come può essere inizializzato?

La mia ipotesi è perché i parametri out non hanno bisogno di essere inizializzato, mentre i parametri ref fanno.

Se è stato utilizzato un parametro out su un metodo parziale, come potrebbe C # verificare che il parametro è stato inizializzato o no?

Un parametro out suggerisce che si desidera un valore al di fuori del metodo. Se il metodo non esiste, non è possibile stabilire che il valore.

L'alternativa sarebbe quella di impostare il valore della variabile in modo esplicito al suo valore di default (0, null ecc) invece di eseguire la chiamata al metodo. In questo modo la variabile sarebbe ancora definitivamente inizializzato - anche se il valore di default non può essere un terribilmente utile. Credo che il C # team hanno considerato questo - si può anche fare in una versione futura, chi lo sa? Personalmente dubito che sarebbe particolarmente utile, ma la possibilità c'è.

Per il momento, si può sempre utilizzare un parametro ref invece, e proprio inizializzare manualmente la variabile prima della chiamata a qualunque sia il valore di default dovrebbe essere.

I assumerebbe il motivo è perché un metodo parziale con solo una firma (cioè senza implementazione) è ancora valido. Se tu avessi un out parametro di un metodo di implementazione meno sarebbe sempre causa un errore (come non c'è nulla di assegnare il valore out)

Procedimento parziale è diviso tra classi parziali. Un metodo è richiesto per assegnare un valore di un parametro OUT. metodi parziali possono o non possono essere attuate. Significherebbe più pezzi di codice sta cercando di assegnare il valore al parametro OUT.

Come tutti params out altro ha dichiarato deve essere assegnato. Per aggiungere questo genererà errore del compilatore CS0177 ref d'altra parte deve essere assegnato prima di effettuare la chiamata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top