Devolver múltiples valores a un llamador de método

Resuelto Ash asked hace 15 años • 28 respuestas

Leí la versión C++ de esta pregunta pero realmente no la entendí.

¿Alguien puede explicar claramente si se puede hacer en C# y cómo?

Ash avatar Apr 14 '09 22:04 Ash
Aceptado

Ahora que se lanzó C# 7, puede usar la nueva sintaxis de Tuplas incluida.

(string, string, string) LookupName(long id) // tuple return type
{
    ... // retrieve first, middle and last from data storage
    return (first, middle, last); // tuple literal
}

que luego podría usarse así:

var names = LookupName(id);
WriteLine($"found {names.Item1} {names.Item3}.");

También puede proporcionar nombres a sus elementos (para que no sean "Elemento1", "Elemento2", etc.). Puedes hacerlo agregando un nombre a la firma o los métodos de devolución:

(string first, string middle, string last) LookupName(long id) // tuple elements have names

o

return (first: first, middle: middle, last: last); // named tuple elements in a literal

También se pueden deconstruir, lo cual es una característica nueva bastante interesante:

(string first, string middle, string last) = LookupName(id1); // deconstructing declaration

Consulte este enlace para ver más ejemplos de lo que se puede hacer :)

Francisco Noriega avatar Apr 05 '2016 20:04 Francisco Noriega

En C# 7 y superior, consulte esta respuesta .

En versiones anteriores, puede utilizar Tuple de .NET 4.0+ :

Por ejemplo:

public Tuple<int, int> GetMultipleValue()
{
     return Tuple.Create(1,2);
}

Las tuplas con dos valores tienen Item1y Item2como propiedades.

Hadas avatar Apr 23 '2012 10:04 Hadas

Puedes utilizar tres formas diferentes.

1. parámetros de referencia / salida

usando referencia:

static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    int add = 0;
    int multiply = 0;
    Add_Multiply(a, b, ref add, ref multiply);
    Console.WriteLine(add);
    Console.WriteLine(multiply);
}

private static void Add_Multiply(int a, int b, ref int add, ref int multiply)
{
    add = a + b;
    multiply = a * b;
}

usando:

static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    int add;
    int multiply;
    Add_Multiply(a, b, out add, out multiply);
    Console.WriteLine(add);
    Console.WriteLine(multiply);
}

private static void Add_Multiply(int a, int b, out int add, out int multiply)
{
    add = a + b;
    multiply = a * b;
}

2. estructura/clase

usando estructura:

struct Result
{
    public int add;
    public int multiply;
}
static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    var result = Add_Multiply(a, b);
    Console.WriteLine(result.add);
    Console.WriteLine(result.multiply);
}

private static Result Add_Multiply(int a, int b)
{
    var result = new Result
    {
        add = a * b,
        multiply = a + b
    };
    return result;
}

usando clase:

class Result
{
    public int add;
    public int multiply;
}
static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    var result = Add_Multiply(a, b);
    Console.WriteLine(result.add);
    Console.WriteLine(result.multiply);
}

private static Result Add_Multiply(int a, int b)
{
    var result = new Result
    {
        add = a * b,
        multiply = a + b
    };
    return result;
}

3. tupla

clase tupla

static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    var result = Add_Multiply(a, b);
    Console.WriteLine(result.Item1);
    Console.WriteLine(result.Item2);
}

private static Tuple<int, int> Add_Multiply(int a, int b)
{
    var tuple = new Tuple<int, int>(a + b, a * b);
    return tuple;
}

C# 7 tuplas

static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    (int a_plus_b, int a_mult_b) = Add_Multiply(a, b);
    Console.WriteLine(a_plus_b);
    Console.WriteLine(a_mult_b);
}

private static (int a_plus_b, int a_mult_b) Add_Multiply(int a, int b)
{
    return(a + b, a * b);
}
Devrim Altınkurt avatar Jun 03 '2015 23:06 Devrim Altınkurt