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?

È stato utile?

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.

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