domingo, 27 de marzo de 2016

Pregunta C# (20 de 20): ¿Cómo Retornar Múltiples Valores desde una Función?

Índice

1. Introducción
2. Palabras Clave
3. Contexto
3.1 Firma de una función en C#
4. Retorno de Múltiples Valores desde una Función
5. Recursos
6. Conclusiones
7. Literatura & Enlaces

1. Introducción

Última pregunta de la serie Twenty C# Questions Answered del curso disponible en Microsoft Virtual Academy. En esta pregunta se responde a la pregunta común de cómo retornar múltiples valores desde una función escrita en C#. Para responderla se recurre a la creación de una clase como estructura de contención de los valores máximo y mínimo, y la escritura de una función que realiza el cómputo del mínimo y máximo.

2. Palabras Clave

  • C#
  • Clase
  • Estructura
  • Función
  • Microsoft Virtual Academy
  • MVA

3. Contexto

3.1 Firma de una función en C#

En el lenguaje de programación C# la declaración de una función sigue la siguiente sintaxis (versión simplificada):

{modificador acceso} {tipo retorno} {nombre función}({parámetros})
{
    {instrucción 1}
    {instrucción 2}
    {instrucción n}

    [return {constante o variable de retorno}]
}

Suponiendo que se quiere declarar el método para la suma de dos valores enteros, entonces la función escrita en código fuente queda así:

public int Sumar(int a, int b)
{
return a + b;
}

El tipo de retorno de una función puede ser cualquier tipo de dato por valor o un tipo de dato por referencia -Tipos por Valor vs. Tipos por Referencia en C#-; lo que quiere decir que se puede retornar una instancia de una estructura -Structs en C#- o de una clase -Clases en C#-.

Esto último permite al programador construir un tipo de dato como contenedor de múltiples valores. La instancia de un tipo de dato como el anterior puede resultar de enorme utilidad para retornar varios valores a una ubicación de código que invoca a una determinada función.

4. Retorno de Múltiples Valores desde una Función

En el siguiente código fuente C# se declara la estructura MaximoMinimo para contener los valores máximo y mínimo de una colección de valores numéricos computados desde una función.

La estructura MaximoMinimo se declara en las líneas 31-60 con las siguientes propiedades:
  • Maximo, y 
  • Minimo
Esta estructura servirá como contenedora de los múltiples valores que retorna el método ObtenerMaximoMinimo(int[]). Este método recibe como argumento un arreglo de enteros y realiza las siguientes operaciones:
  • Línea 23: creación de instancia de MaximoMinimo.
  • Línea 24: asignación del máximo del arreglo valores a la propiedad Maximo de MaximoMinimo. Max() ("Enumerable.Max(TSource)", 2016) es un método de extensión definido en el namespace System.Linq.
  • Línea 25: asignación del mínimo del arreglo valores a la propiedad Minimo de MaximoMinimoMin() ("Enumerable.Min(TSource)", 2016) es un método de extensión definido en el namespace System.Linq.
  • Línea 27: retorno de la instancia MaximoMinimo.
[Aclaración: Una clase también constituye una alternativa como contenedor de los valores máximo y mínimo; sin embargo para efectos de simplicidad se optó por una estructura por la baja complejidad de demanda este caso de ejemplo.]

En el método Main, en particular en la línea 17, se muestra el valor máximo y mínimo calculado en el método ObtenerMaximoMinimo().

Compilación:

csc /t:exe MultiplesValoresRetorno.cs

Ejecución assembly

.\MultiplesValoresRetorno.exe

Demostración ejecución assembly (ideone.com): 

Máximo: 61; mínimo: 5

Demostración ejecución assembly (local): 
Ejecución assembly MultiplesValoresRetorno.exe
Figura 1. Ejecución assembly MultiplesValoresRetorno.exe.

5. Recursos

Este es el vídeo en donde el equipo de expertos Gerry O'Brein y Paul Pardi de MVA, responden y explican esta pregunta:

6. Conclusiones

Al finalizar esta pregunta C# se comprendió cómo es posible retornar múltiples valores desde una función: a través de una estructura -como el caso de MaximoMinimo- o por medio de una clase. Para el ejemplo de la sección práctica, se optó por la estructura por su simplicidad.

7. Literatura & Enlaces

Top C# Questions Answered | Microsoft Virtual Academy (2016, marzo 27). Recuperado desde: https://mva.microsoft.com/en-US/training-courses/twenty-c-questions-answered-8298?l=4paONXYy_9604984382
Tipos por Valor vs. Tipos por Referencia (2016, marzo 27). Recuperado desde: http://ortizol.blogspot.com.co/2013/07/tipos-por-valor-vs-tipos-por-referencia.html
Structs en c# (2016, marzo 27). Recuperado desde: http://ortizol.blogspot.com/2014/04/structs-en-c.html
Clases en C# (2016, marzo 27). Recuperado desde: http://ortizol.blogspot.com/2013/10/clases-en-c.html
Enumerable.Max(TSource) Method (IEnumerable(TSource)) (System.Linq) (2016, marzo 27). Recuperado desde: https://msdn.microsoft.com/en-us/library/bb347632(v=vs.110).aspx
Enumerable.Min Method (System.Linq) (2016, marzo 27). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.linq.enumerable.min(v=vs.110).aspx


V

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.