Returning multiple values via out parameters is messy. Tuples with deconstruction are clean.
Old Way (out parameters):
public bool TryParse(string input, out int result, out string error)
{
// Ugly signature, can't use in expressions
}
// Usage
if (TryParse(input, out int result, out string error))
{
// ...
}
Tuple Return:
public (bool success, int result, string error) Parse(string input)
{
if (int.TryParse(input, out int result))
return (true, result, "");
else
return (false, 0, "Invalid number");
}
// Clean deconstruction
var (success, result, error) = Parse("123");
if (success)
{
Console.WriteLine($"Result: {result}");
}
Named Tuples:
public (int min, int max, double average) GetStats(int[] numbers)
{
return (
min: numbers.Min(),
max: numbers.Max(),
average: numbers.Average()
);
}
var stats = GetStats(numbers);
Console.WriteLine($"Min: {stats.min}, Max: {stats.max}");
Readable, type-safe, expression-friendly!
