C # Fora questão parâmetro: Como funciona Out tipos de valor punho?
-
22-07-2019 - |
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?
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.