Eu li a versão C ++ desta pergunta, mas realmente não a entendi.
Alguém pode explicar claramente se isso pode ser feito e como?
Eu li a versão C ++ desta pergunta, mas realmente não a entendi.
Alguém pode explicar claramente se isso pode ser feito e como?
No C # 7 e acima, veja esta resposta .
Nas versões anteriores, você pode usar a tupla do .NET 4.0 + :
Por exemplo:
public Tuple<int, int> GetMultipleValue()
{
return Tuple.Create(1,2);
}
Tuplas com dois valores têm Item1
e Item2
como propriedades.
public (int sum, int count) GetMultipleValues() { return (1, 2); }
Este exemplo foi retirado do nosso exemplo de tópico de documentação .Agora que o C # 7 foi lançado, você pode usar a nova sintaxe incluída das Tuplas
que poderia ser usado assim:
Você também pode fornecer nomes para seus elementos (para que eles não sejam "Item1", "Item2" etc.). Você pode fazer isso adicionando um nome à assinatura ou aos métodos de retorno:
ou
Eles também podem ser desconstruídos, o que é um novo recurso bastante interessante:
Confira este link para ver mais exemplos sobre o que pode ser feito :)
fonte
Você pode usar três maneiras diferentes
1. parâmetros ref / out
usando ref:
usando fora:
2. estrutura / classe
usando struct:
usando classe:
3. Tupla
Classe de tupla
Tuplas C # 7
fonte
Você não pode fazer isso em c #. O que você pode fazer é ter um
Usando o parâmetro Usando classe personalizada (ou estrutura)out
parâmetro ou retornar sua própria classe (ou struct, se você quiser que seja imutável).fonte
async
métodos.Tuple
é o caminho a percorrer. (Eu usoout
parâmetros em operações síncronas embora, pois eles são realmente úteis nesses casos.)Se você quer dizer retornar vários valores, pode retornar uma classe / estrutura contendo os valores que deseja retornar ou usar a palavra-chave "out" em seus parâmetros, da seguinte maneira:
fonte
O pôster anterior está certo. Você não pode retornar vários valores de um método C #. No entanto, você tem algumas opções:
Os prós e contras aqui são muitas vezes difíceis de descobrir. Se você retornar uma estrutura, verifique se ela é pequena, porque as estruturas são do tipo valor e transmitidas para a pilha. Se você retornar uma instância de uma classe, existem alguns padrões de design aqui que você poderá usar para evitar problemas - os membros das classes podem ser modificados porque o C # passa objetos por referência (você não tem ByVal como no VB )
Finalmente, você pode usar parâmetros de saída, mas eu limitaria o uso disso a cenários em que você tenha apenas alguns (como 3 ou menos) parâmetros - caso contrário, as coisas ficam feias e difíceis de manter. Além disso, o uso de parâmetros de saída pode ser um inibidor da agilidade, pois a assinatura do método precisará ser alterada toda vez que você precisar adicionar algo ao valor de retorno. Ao retornar uma instância de struct ou de classe, você poderá adicionar membros sem modificar a assinatura do método.
Do ponto de vista arquitetural, eu recomendaria não usar pares ou dicionários de valor-chave. Acho que esse estilo de codificação requer "conhecimento secreto" no código que consome o método. Ele deve saber com antecedência o que serão as chaves e o que significam os valores. Se o desenvolvedor que trabalha na implementação interna mudar a maneira como o dicionário ou o KVP é criado, poderá facilmente criar uma cascata de falhas em todo o aplicativo.
fonte
Exception
se o segundo valor que você deseja retornar for disjuntivo em relação ao primeiro: como quando você deseja retornar um tipo de valor bem-sucedido ou um tipo de valor malsucedido.Você quer retornar uma instância de classe ou usar a parâmetros. Aqui está um exemplo de parâmetros externos:
Chame assim:
fonte
Há muitas maneiras; mas se você não quiser criar um novo objeto ou estrutura ou algo parecido com isto, faça o seguinte abaixo do C # 7.0 :
fonte
No C # 7, há uma nova
Tuple
sintaxe:Você pode retornar isso como um registro:
Você também pode usar a nova sintaxe do desconstrutor:
Tenha cuidado com a serialização, no entanto, tudo isso é açúcar sintático - no código compilado real, este será um
Tuple<string, int>
(conforme a resposta aceita ) comItem1
e emItem2
vez defoo
ebar
. Isso significa que a serialização (ou desserialização) usará esses nomes de propriedades.Portanto, para serialização, declare uma classe de registro e retorne-a.
Também novo no C # 7 é uma sintaxe aprimorada para
out
parâmetros. Agora você pode declarar oout
inline, que é mais adequado em alguns contextos:No entanto, você o utilizará principalmente nas próprias bibliotecas do .NET, e não nas suas próprias funções.
fonte
Outras respostas declaradas usando Tuple, que eu recomendaria também, mas usando o novo recurso introduzido no C # 7.0.
Mais informações podem ser encontradas aqui .
fonte
Existem várias maneiras de fazer isso. Você pode usar
ref
parâmetros:Isso passa uma referência à função, permitindo que a função modifique o objeto na pilha do código de chamada. Embora esse tecnicamente não seja um valor "retornado", é uma maneira de fazer com que uma função faça algo semelhante. No código acima, a função retornaria uma
int
e (potencialmente) modificaçãobar
.Outra abordagem semelhante é usar um
out
parâmetro. Umout
parâmetro é idêntico a umref
parâmetro com uma regra adicional aplicada pelo compilador. Esta regra é que, se você passar umout
parâmetro para uma função, essa função é necessária para definir seu valor antes de retornar. Além dessa regra, umout
parâmetro funciona exatamente como umref
parâmetro.A abordagem final (e a melhor na maioria dos casos) é criar um tipo que encapsule os dois valores e permita que a função retorne:
Essa abordagem final é mais simples e fácil de ler e entender.
fonte
Não, você não pode retornar vários valores de uma função em C # (para versões inferiores a C # 7), pelo menos não da maneira que você pode fazê-lo em Python.
No entanto, existem algumas alternativas:
Você pode retornar uma matriz do tipo de objeto com os vários valores que deseja.
Você pode usar
out
parâmetros.fonte
No C # 4, você poderá usar o suporte interno para tuplas para lidar com isso facilmente.
Enquanto isso, existem duas opções.
Primeiro, você pode usar parâmetros ref ou out para atribuir valores aos seus parâmetros, que são passados de volta à rotina de chamada.
Isso se parece com:
Segundo, você pode agrupar seus valores de retorno em uma estrutura ou classe e passá-los de volta como membros dessa estrutura. KeyValuePair funciona bem para 2 - para mais de 2 você precisaria de uma classe ou estrutura personalizada.
fonte
você pode tentar este "KeyValuePair"
Resultado :
Saída: 1, 2
fonte
Classes, estruturas, coleções e matrizes podem conter vários valores. Os parâmetros de saída e referência também podem ser definidos em uma função. O retorno de vários valores é possível em linguagens dinâmicas e funcionais por meio de tuplas, mas não em C #.
fonte
Principalmente dois métodos estão lá. 1. Use out / ref parameters 2. Retorne uma matriz de objetos
fonte
Aqui estão os
Two
métodos básicos :1) Uso de '
out
' como parâmetro Você também pode usar 'out' para as versões 4.0 e secundárias.Exemplo de 'fora':
Resultado:
Área do retângulo é 20
O perímetro do retângulo é 18
* Nota: * A
out
palavra-chave descreve parâmetros cujos locais reais das variáveis são copiados na pilha do método chamado, onde esses mesmos locais podem ser reescritos. Isso significa que o método de chamada acessará o parâmetro alterado.2)
Tuple<T>
Exemplo de tupla:
Retornando vários valores DataType usando
Tuple<T>
Resultado
NOTA: O uso da Tupla é válido a partir do Framework 4.0 e superior .
Tuple
tipo é aclass
. Ele será alocado em um local separado na pilha gerenciada na memória. Depois de criar oTuple
, você não poderá alterar os valores delefields
. Isso faz com queTuple
mais pareça umstruct
.fonte
Você pode receber código como
Eu espero que dê certo.
fonte
Um método que leva um delegado pode fornecer vários valores ao chamador. Isso toma emprestado minha resposta aqui e usa um pouco da resposta aceita por Hadas .
Os chamadores fornecem uma lambda (ou uma função nomeada) e o intellisense ajuda copiando os nomes das variáveis do delegado.
fonte
Basta usar de maneira OOP uma classe como esta:
O membro da função retorna o quociente no qual a maioria dos chamadores está interessada. Além disso, armazena o restante como um membro de dados, que é facilmente acessível pelo chamador posteriormente.
Dessa forma, você pode ter muitos "valores de retorno" adicionais, muito úteis se você implementar chamadas de banco de dados ou de rede, onde muitas mensagens de erro podem ser necessárias, mas apenas no caso de ocorrer um erro.
Eu entrei nessa solução também na pergunta C ++ à qual o OP está se referindo.
fonte
A partir deste artigo, você pode usar três opções como postos acima disse.
KeyValuePair é a maneira mais rápida.
out está no segundo.
Tupla é a mais lenta.
De qualquer forma, isso depende do que é melhor para o seu cenário.
fonte
A versão futura do C # incluirá tuplas nomeadas. Dê uma olhada nesta sessão do canal9 para a demonstração https://channel9.msdn.com/Events/Build/2016/B889
Pule para 13:00 para o material da tupla. Isso permitirá coisas como:
(exemplo incompleto do vídeo)
fonte
Você poderia usar um objeto dinâmico. Eu acho que tem melhor legibilidade que Tuple.
fonte
Maneiras de fazer isso:
1) KeyValuePair (melhor desempenho - 0,32 ns):
2) Tupla - 5,40 ns:
3) out (1,64 ns) ou ref 4) Crie sua própria classe / estrutura personalizada
ns -> nanossegundos
Referência: multiple-return-values .
fonte
você pode tentar isso
fonte
yield return "value1"; yield return "value2";
para não precisar criar explicitamente um novostring[]
?Você também pode usar um OperationResult
fonte
Uma resposta rápida, especialmente para retornos de tipo de matriz:
Usando:
fonte