Domanda parametro C # Out: In che modo Out gestisce i tipi di valore?
-
22-07-2019 - |
Domanda
AGGIORNAMENTO Quindi, è stato un momento davvero straordinario. Intendevo davvero per riferimento contro Out / Ref. Tutto ciò che dice 'ref' intendevo davvero come riferimento in
SomeMethod (Object someObject)
Versus
SomeMethod (out someObject)
Spiacenti. Non voglio cambiare il codice, quindi le risposte hanno già un senso.
Per quanto ho capito, a differenza di ref dove "copia" il puntatore e crea un nuovo spazio nello stack per utilizzare quel puntatore, ma non cambierà il puntatore:
SomeMethod()
{
SomeThing outer = new SomeThing();
RefMethod(ref outer)
}
RefMethod(ref inner) //new space on stack created and uses same pointer as outer
{
inner.Hi = "There"; //updated the object being pointed to by outer
inner = new SomeThing();//Given a new pointer, no longer shares pointer with outer
//New object on the heap
}
Out copia il puntatore e può manipolare il punto in cui punta:
SomeMethod()
{
SomeThing outer = new SomeThing();
RefMethod(out outer)
}
RefMethod(out inner) //same pointer shared
{
inner = new SomeThing();//pointer now points to new place on heap
//outer now points to new object
//Old object is orphaned if nothing else points to it
}
Va ??bene e dandy con gli oggetti, ma per quanto riguarda i tipi di valore visto che non hanno nulla da indicare di essere solo nello stack?
Soluzione
Solo perché la variabile vive nello stack (se è una variabile locale) non significa che non puoi creare un puntatore ad essa - e in effetti è così anche con i tipi di riferimento.
Il puntatore all'interno di RefMethod è sul " esterno " variabile - e la variabile stessa vive nello stack in quanto è una variabile locale non acquisita.
Come ha detto Leppie, ref e out sono identici, tranne per le regole sull'assegnazione definita - in effetti, l'unica differenza in IL è un attributo applicato ai parametri out.
Vedi il mio articolo sul passaggio dei parametri per maggiori dettagli su ref / out in generale .
Altri suggerimenti
ref e out è esattamente lo stesso, per quanto ne so, con l'eccezione che un parametro out non può essere inizializzato. Quindi entrambi vanno in pila.
In realtà l'utilizzo di ref o out su Tipi di riferimento crea anche un puntatore ... non sull'oggetto ma sul riferimento all'oggetto! Quindi sarebbe una specie di
RefMethod(SomeThing **inner)
{
}
in C ++, mentre con i tipi di valore sarebbe
RefMethod2(int *inner)
{
}
per i tipi di valore.