C # tem as palavras out
- ref
chave Por que esses dois são necessários? Isenção de responsabilidade: não tenho conhecimento profundo de c #.
c#
parameters
keywords
Neo
fonte
fonte
ref
eout
? Ou você está perguntando qual é o uso de argumentos por referênciaref
/out
em comparação com argumentos por valor (sem modificador para o parâmetro)? Ou ambos?Respostas:
Em termos de implementação, eles são essencialmente a mesma coisa, mas
out
comunica algo queref
não acontece: você não se importa com a entrada. Isso significa certas coisas para você e ferramentas. Por exemplo, você pode passar uma variável não inicializada para umout
parâmetro e isso não é um problema, onde seria caso contrário, e dentro da função é necessário atribuir um valor aoout
parâmetro antes que ele retorne, enquanto não há necessidade de fazer nada em tudo com umref
valor.fonte
out
fornece uma maneira de fazê-lo, que melhor corresponde à maneira como você deseja lidar com as variáveis em primeiro lugar.out
parâmetro, porque a função que o recebe não vai ler dele .Para entender essas duas palavras-chave, você precisará entender o que significa passar um valor por referência . Essencialmente, isso significa que, se você modificar a variável de parâmetro que você transmite dentro do método ou função, essa variável reterá seu valor modificado quando sua função sair. Declarar um parâmetro como
ref
ouout
realiza isso, enquanto uma variável de parâmetro comum manteria seu valor original, mesmo se você o modificasse na função.As únicas diferenças entre
ref
eout
é queout
não exigem que você inicialize a variável antes de passá-la para a função, masref
sim; enquantoout
faz necessário que você atribuir algo para a variável dentro da função, masref
não o faz.fonte
Você perguntou.
E a resposta é que eles não são NECESSÁRIOS, java, por exemplo, também não tem e o VB apenas possui ref (e somente o requer na declaração do método).
Você pode escrever facilmente um programa inteiro sem usar nenhum dos dois.
Eles existem porque são ocasionalmente úteis. É por isso que existem dois deles e não apenas um - porque é útil fazer a distinção entre 'aqui está alguma coisa, modifique-a se você quiser' e 'dê a essa coisa um novo valor'.
Outros idiomas têm prioridades diferentes e, portanto, podem ou não incluir essas ou equivalentes. Eles podem até discordar sobre se um deles é útil e, portanto, podem decidir ativamente NÃO implementar um ou outro.
fonte
Em sua essência tanto
ref
eout
fornecer um mecanismo para passar o endereço de uma variável a um método para que ele possa ser atualizado - atribuindo aoref
ouout
parâmetro atualiza a variável no contexto do chamador. Onde eles diferem está nas garantias:out
garante que a variável será atualizada,ref
não.Do outro lado da chamada, existem diferenças semelhantes.
out
Não é garantido que um parâmetro para nosso método contenha algo útil na chegada e deve ser definido como um valor em algum momento, enquanto umref
parâmetro pode ser assumido como tendo um valor e não precisamos fazer nada específico com ele.Essa diferença tem impactos na análise, geração e otimização de código que, embora não sejam muito aparentes para nós na maioria das vezes, podem ter alguns efeitos na maneira como nossos programas acabam operando. O gerador de código pode adiar a alocação da variável até imediatamente antes da chamada, o otimizador pode decidir que pode reordenar algumas operações com mais eficácia com base no contrato, etc.
Em termos de uso: como regra geral, uso
out
para situações em que não me importo com o conteúdo da variável quando ela chega como parâmetro eref
quando eu faço.fonte