Funzione con più valori di ritorno

Funzione con più valori di ritorno

# soluzione "oggetto anonimo" + "parola chiave dinamica"

Puoi restituire un oggetto anonimo dalla tua funzione

public static object FunctionWithUnknowReturnValues ()
{
    /// anonymous object
    return new { a = 1, b = 2 };
}

E assegna il risultato a un oggetto dinamico e leggi i valori in esso contenuti.

/// dynamic object
dynamic x = FunctionWithUnknowReturnValues();

Console.WriteLine(x.a);
Console.WriteLine(x.b);

# soluzione di tupla

Puoi restituire un'istanza di Tuple classe dalla tua funzione con due parametri del modello come Tuple<string, MyClass> :

public Tuple<string, MyClass> FunctionWith2ReturnValues ()
{
    return Tuple.Create("abc", new MyClass());
}

E leggi i valori come di seguito:

Console.WriteLine(x.Item1);
Console.WriteLine(x.Item2);

# parametri Ref e Out

Il ref la parola chiave viene utilizzata per passare un argomento come riferimento. out farà lo stesso di ref ma non richiede un valore assegnato dal chiamante prima di chiamare la funzione.

Parametro di riferimento :-Se vuoi passare una variabile come parametro ref, devi inizializzarla prima di passarla come parametro ref al metodo.

Parametro Out :- Se vuoi passare una variabile come parametro out non è necessario inizializzarla prima di passarla come parametro out al metodo.

static void Main(string[] args)
{
    int a = 2;
    int b = 3;
    int add = 0;
    int mult= 0;
    AddOrMult(a, b, ref add, ref mult); //AddOrMult(a, b, out add, out mult);
    Console.WriteLine(add); //5
    Console.WriteLine(mult); //6
}

private static void AddOrMult(int a, int b, ref int add, ref int mult) //AddOrMult(int a, int b, out int add, out int mult)
{
    add = a + b;
    mult = a * b;
}

# Osservazioni

Non esiste una risposta intrinseca in C# a questa cosiddetta esigenza. Tuttavia esistono soluzioni alternative per soddisfare questa esigenza.

Il motivo per cui qualifico la necessità come "cosiddetta" è che abbiamo solo bisogno di metodi con 2 o più di 2 valori da restituire quando violiamo i buoni principi di programmazione. Soprattutto il principio della responsabilità unica.

Quindi, sarebbe meglio essere avvisati quando abbiamo bisogno di funzioni che restituiscono 2 o più valori e migliorare il nostro design.