Pergunta

Update para que totalmente puxado um momento ferramenta. Eu realmente quis dizer com referência, versus Out / Ref. Qualquer coisa que diz 'ref' Eu realmente queria dizer com referência como em

SomeMethod (someObject Object)

Versus

SomeMethod (fora someObject)

Desculpe. Só não quero mudar o código para as respostas já faz sentido.

Tanto quanto eu entendo, ref ao contrário de onde ele "cópias" do ponteiro e cria um novo espaço na pilha para usar esse ponteiro, mas não vai mudar o ponteiro:

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
}

cópias do ponteiro e pode manipular, onde ele aponta para:

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
}

Isso é bom e dândi com objetos, mas que sobre os tipos de valor vendo como eles não têm nada a ponto de ser apenas na pilha?

Foi útil?

Solução

Só porque as variáveis ??vidas na pilha (se é uma variável local) não significa que você não pode criar um ponteiro para ele -. E que na verdade é o caso com tipos de referência, bem

O ponteiro dentro RefMethod é a variável "exterior" -. E a própria variável vive na pilha como é uma variável local uncaptured

Como leppie disse, ref e fora são idênticos, exceto para as regras de atribuição definitiva - na verdade, a única diferença em IL é um atributo aplicado a parâmetros de saída

.

meu artigo sobre a passagem de parâmetros para obter mais detalhes sobre ref / out em geral .

Outras dicas

ref e fora é exatamente o mesmo, até onde eu sei, com a ressalva de que um parâmetro de saída não pode ser inicializado. Daí tanto vai para a pilha.

Na verdade usando ref ou no Tipos de referência também cria um ponteiro ... não o objeto, mas a referência para o objeto! Portanto, seria uma espécie de

RefMethod(SomeThing **inner)
{
}

em C ++, enquanto que com os tipos de valor que seria

RefMethod2(int *inner)
{
}

para tipos de valor.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top