Entendo que, se eu passar um tipo de valor ( int
, struct
etc.) como parâmetro (sem a ref
palavra - chave), uma cópia dessa variável é passada para o método, mas se eu usar a ref
palavra-chave, uma referência a essa variável será passada, não é novo.
Mas com tipos de referência, como classes, mesmo sem a ref
palavra - chave, uma referência é passada para o método, não uma cópia. Então, qual é o uso da ref
palavra-chave com tipos de referência?
Considere por exemplo:
var x = new Foo();
Qual é a diferença entre os seguintes?
void Bar(Foo y) {
y.Name = "2";
}
e
void Bar(ref Foo y) {
y.Name = "2";
}
c#
parameters
pass-by-reference
pass-by-value
Andreas Grech
fonte
fonte
Há casos em que você deseja modificar a referência real e não o objeto apontado:
fonte
Jon Skeet escreveu um ótimo artigo sobre a passagem de parâmetros em C #. Ele detalha claramente o comportamento exato e o uso de passar parâmetros por valor, por referência (
ref
) e por saída (out
).Aqui está uma citação importante dessa página em relação aos
ref
parâmetros:fonte
Muito bem explicado aqui: http://msdn.microsoft.com/en-us/library/s6938f28.aspx
Resumo do artigo:
fonte
Quando você passa um tipo de referência com a palavra-chave ref, passa a referência por referência, e o método que você chama pode atribuir um novo valor ao parâmetro. Essa alteração será propagada para o escopo da chamada. Sem ref, a referência é passada por valor, e isso não acontece.
O C # também possui a palavra-chave 'out', que é muito parecida com ref, exceto que, com 'ref', os argumentos devem ser inicializados antes de chamar o método e, com 'out', você deve atribuir um valor no método de recebimento.
fonte
Permite modificar a referência transmitida.
Você também pode usar fora se você não se preocupam com a referência passou em:
fonte
Outro monte de código
fonte
Além das respostas existentes:
Como você pediu a diferença dos 2 métodos: Não há variação co (ntra) ao usar
ref
ouout
:fonte
Um parâmetro em um método parece estar sempre passando uma cópia, a questão é uma cópia do quê. Uma cópia é feita por um construtor de cópia para um objeto e, como todas as variáveis são Object em C #, acredito que esse seja o caso de todas elas. Variáveis (objetos) são como pessoas que moram em alguns endereços. Mudamos as pessoas que moram nesses endereços ou podemos criar mais referências às pessoas que moram nesses endereços na lista telefônica (faça cópias rasas). Portanto, mais de um identificador pode se referir ao mesmo endereço. Os tipos de referência desejam mais espaço; portanto, diferentemente dos tipos de valor conectados diretamente por uma seta ao seu identificador na pilha, eles têm valor para outro endereço na pilha (um espaço maior para permanecer). Esse espaço precisa ser retirado da pilha.
Tipo de valor: Identificador (contém valor = endereço do valor da pilha) ----> Valor do tipo de valor
Tipo de referência: Identificador (contém valor = endereço do valor da pilha) ----> (contém valor = endereço do valor da pilha) ----> Valor da pilha (na maioria das vezes contém endereços para outros valores), imagine mais setas coladas em diferentes direções para Matriz [0], Matriz [1], matriz [2]
A única maneira de alterar um valor é seguir as setas. Se uma seta for perdida / alterada da maneira que o valor estiver inacessível.
fonte
Variáveis de referência transportam o endereço de um lugar para outro, portanto, qualquer atualização nelas em qualquer lugar refletirá em todos os lugares ENTÃO, qual é o uso de REF. A variável de referência (405) é boa até que nenhuma nova memória seja alocada para a variável de referência passada no método.
Depois que a nova memória alocar (410), a alteração de valor neste objeto (408) não será refletida em todos os lugares. Para esta referência vem. Ref é referência de referência, portanto, sempre que a nova memória alocar, ela será conhecida porque está apontando para esse local, portanto, o valor pode ser compartilhado por everyOne. Você pode ver a imagem para obter mais clareza.
fonte