csharp-retorno-funciones

Retorno de funciones en C#

El retorno de una función es un valor que tras su finalización (y opcionalmente) una función puede devolver al código que la llamó. Para ello se emplea la palabra reservada return.

Este valor puede ser de cualquier tipo de datos, incluidos tipos básicos (como int, float, string), tipos complejos (como objetos y estructuras) e incluso tipos de datos personalizados.

También es posible que una función no devuelva ningún valor. Eso se indica mediante el tipo void.

Por otro lado únicamente es posible devolver un valor. Aunque podemos devolver una agrupación de valores (como una colección, una tupla o una clase).

Retorno de void

Cuando una función no necesita devolver ningún valor se declara con el tipo de retorno void. Estas funciones generalmente realizan acciones (como modificar el estado de un objeto o imprimir en la consola).

Por ejemplo, la función saludar() únicamente realiza una acción, no necesita devolver ningún valor. En ese caso empleamos la palabra reservada void.

public void Saludar()
{
    Console.WriteLine("¡Hola!");
}

Retorno de un valor

Como hemos dicho, una función puede devolver un único valor. Para ello se emplea la palabra clave return. En el momento que se alcanza un return, la ejecución de la función se detiene, y se devuelve el control a la función que la invocó.

Por ejemplo, función Sumar devuelve un valor de tipo int.

public int Sumar(int a, int b)
{
    return a + b;
	
	// si aqui hubiera algo, no se llegaría a ejecutar
}

Lógicamente, el tipo de retorno de la función debe coincidir con el tipo del valor que devolvemos.

Retorno de múltiples valores

Como decíamos, únicamente es posible devolver un único valor con una función. Sin embargo, podemos devolver una agrupación de valores.

Usar clases o estructuras

Por ejemplo, podemos devolver múltiples valores encapsularlos en una clase o estructura.

public class Resultado
{
    public int Numero { get; set; }
    public string Texto { get; set; }
}

public Resultado ObtenerResultado()
{
    return new Resultado { Numero = 42, Texto = "Ejemplo" };
}

Esta es la forma más habitual de devolver múltiples valores en C#.

Usar Tuplas

También podemos usar tuplas cuando queremos devolver múltiples valores desde una función.

public (int, string) ObtenerDatos()
{
    return (42, "Ejemplo");
}

Esto es útil cuando la agrupación que vamos a devolver tiene carácter temporal, y no nos merece la pena crear una estructura o objeto únicamente para la devolución.

Retorno de colecciones

Las funciones también pueden devolver objetos de cualquier tipo de colecciones, como arrays, listas, diccionarios.

Por ejemplo así.

public List<int> ObtenerLista()
{
    return new List<int> { 1, 2, 3, 4, 5 };
}

Ejemplos prácticos

Ejempo de función void

En este ejemplo, se muestra cómo definir una función que no retorna ningún valor utilizando el tipo de retorno void.

// Función que imprime un mensaje en la consola
public void MostrarMensaje(string mensaje)
{
    Console.WriteLine(mensaje); // Imprimir el mensaje recibido
}

// Uso
MostrarMensaje("Hola, Mundo!"); // Llamar a la función con el mensaje "Hola, Mundo!"

Ejemplo de función con retorno de valor

En este ejemplo, se muestra cómo definir una función que retorna un valor. En este caso, se calcula el área de un círculo.

// Función que calcula el área de un círculo dado su radio
public double CalcularAreaCirculo(double radio)
{
    return Math.PI * radio * radio; // Retornar el área calculada
}

// Uso
double area = CalcularAreaCirculo(5.0); // Llamar a la función y almacenar el resultado
Console.WriteLine($"El área del círculo es: {area}"); // Imprimir el área del círculo

Ejemplo de función con retorno de tupla

En este ejemplo, se muestra cómo definir una función que retorna una tupla. En este caso, se calcula la suma y el producto de dos números.

// Función que calcula la suma y el producto de dos números
public (int suma, int producto) CalcularSumaYProducto(int a, int b)
{
    return (a + b, a * b); // Retornar una tupla con la suma y el producto
}

// Uso
var resultado = CalcularSumaYProducto(3, 4); // Llamar a la función y almacenar el resultado en una tupla
Console.WriteLine($"Suma: {resultado.suma}, Producto: {resultado.producto}"); // Imprimir la suma y el producto

Ejemplo de función con retorno de clase

En este ejemplo, se muestra cómo definir una función que retorna una instancia de una clase. En este caso, se crea una instancia de la clase Persona.

// Clase que representa a una persona con nombre y edad
public class Persona
{
    public string Nombre { get; set; } // Propiedad para el nombre
    public int Edad { get; set; } // Propiedad para la edad
}

// Función que crea una instancia de la clase Persona
public Persona CrearPersona(string nombre, int edad)
{
    return new Persona { Nombre = nombre, Edad = edad }; // Retornar una nueva instancia de Persona
}

// Uso
Persona persona = CrearPersona("Luis", 30); // Llamar a la función y almacenar el resultado en una variable
Console.WriteLine($"Nombre: {persona.Nombre}, Edad: {persona.Edad}"); // Imprimir el nombre y la edad de la persona