Algo como o seguinte:
exemplo ref:
void changeString(ref String str) {
str = "def";
}
void main() {
String abc = "abc";
changeString(ref abc);
System.out.println(abc); //prints "def"
}
nosso exemplo:
void changeString(out String str) {
str = "def";
}
void main() {
String abc;
changeString(out abc);
System.out.println(abc); //prints "def"
}
ref
ouout
em C # é quando estou usando um padrão comoTryParse()
, onde o método retorna um resultado booleano e a única maneira de obter um valor analisado dele é usandoref
ouout
.Respostas:
Não, Java não tem algo como C #
ref
eout
palavras - chave para passar por referência.Você só pode passar por valor em Java. Mesmo as referências são passadas por valor. Veja a página de Jon Skeet sobre passagem de parâmetros em Java para mais detalhes.
Para fazer algo semelhante a
ref
ou,out
você teria que envolver seus parâmetros dentro de outro objeto e passar essa referência de objeto como um parâmetro.fonte
ref
.Reference parameters need the ref modifier as part of both the declaration and the invocation - that means it's always clear when you're passing something by reference.
yoda.arachsys.com/csharp/parameters.htmlT&
) por valor, sim. Mas C # tem sua própria terminologia e especificamente não inclui coisas como valores de tiporef T
- da perspectiva do C #,ref
é estritamente um modificador de parâmetro e falar em "passar uma referência por valor" em relação a ele não faz sentido .Resposta direta: não
Mas você pode simular a referência com wrappers .
E faça o seguinte:
Fora
E basicamente qualquer outro tipo, como:
fonte
Na verdade, não há nem ref nem palavra - chave out equivalente na linguagem Java , até onde eu sei. No entanto, acabei de transformar um código C # em Java que usa o parâmetro out e aconselhará o que acabei de fazer. Você deve envolver qualquer objeto em uma classe de invólucro e passar os valores agrupados na instância do objeto de invólucro da seguinte forma;
Um exemplo simples para usar Wrapper
Aqui está a classe Wrapper ;
E aqui está o código de teste;
Um exemplo do mundo real
Método AC # .NET usando parâmetro out
Aqui há um método C # .NET que está usando a palavra - chave out ;
Java equivalente ao código C # que está usando o parâmetro out
E o equivalente em Java deste método com a ajuda da classe wrapper é o seguinte;
Classe Wrapper
E a classe de wrapper usada neste código Java é a seguinte;
fonte
Java passa parâmetros por valor e não possui nenhum mecanismo para permitir a passagem por referência. Isso significa que sempre que um parâmetro é passado, seu valor é copiado para o quadro de pilha que trata da chamada.
O termo valor, conforme o uso aqui, precisa de um pequeno esclarecimento. Em Java, temos dois tipos de variáveis - primitivas e objetos. Um valor de uma primitiva é a própria primitiva, e o valor de um objeto é sua referência (e não o estado do objeto que está sendo referenciado). Portanto, qualquer alteração no valor dentro do método alterará apenas a cópia do valor na pilha e não será vista pelo chamador. Por exemplo, não há como implementar um método de troca real, que recebe duas referências e as troca (não seu conteúdo!).
fonte
Como muitos outros, precisei converter um projeto C # para Java. Não encontrei uma solução completa na web em relação aos modificadores out e ref . Mas consegui pegar as informações que encontrei e expandi-las para criar minhas próprias classes para atender aos requisitos. Eu queria fazer uma distinção entre os parâmetros ref e out para clareza de código. Com as classes abaixo, é possível. Que esta informação economize tempo e esforço de outras pessoas.
Um exemplo está incluído no código abaixo.
fonte
Três soluções não oficialmente mencionadas explicitamente:
Para o Pair, eu recomendaria: https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/tuple/Pair.html
fonte
java não tem uma maneira padrão de fazer isso. A maioria das trocas será feita na lista que é fornecida na aula. mas existe uma maneira não oficial de fazer isso:
fonte