Parámetros y return
En resumen: Un parámetro es una variable del método que recibe el valor pasado en la llamada (el argumento), y return devuelve un resultado a quien hace la llamada.
Problema
Un recibo, totales distintos
Quieres un método que imprima la última línea del recibo: «Total: … €». Pero el total es distinto en cada pedido.
Los métodos de la lección anterior imprimen siempre lo mismo. Un método PrintTotal() no tiene de dónde saber el total. Tampoco quieres un método aparte para cada total. Necesitas una forma de pasar el total al método cuando lo llamas.
La idea
Parámetros: lo que recibe el método
Entre paréntesis declaras lo que el método espera: un tipo y un nombre. Eso es un parámetro. Dentro del método es una variable normal.
Al hacer la llamada, pones el valor entre paréntesis. Ese valor se llama argumento.
static void PrintTotal(double total){ Console.WriteLine("Total: " + total + " €");}
PrintTotal(12.5);PrintTotal(4.2);Total: 12.5 €Total: 4.2 €double total es el parámetro. 12.5 y 4.2 son los argumentos. Hay un solo método, y imprime totales distintos.
Si hay varios parámetros, los separas con comas. Los argumentos se pasan en el mismo orden.
Pruébalo
Por posición, no por nombre
¿Qué imprimirá el programa?
static void PrintLine(string item, int qty){ Console.WriteLine(item + ": " + qty + " uds.");}
string coffee = "Café";int qty = 3;PrintLine(coffee, 2);Los argumentos se asocian con los parámetros por posición: el primero con item, el segundo con qty. La variable qty de fuera no tiene nada que ver con el parámetro qty, aunque se llamen igual.
Problema
¿Por qué no bajó el precio?
Has escrito un método para un descuento del 10% y lo has llamado:
static void ApplyDiscount(double price){ price = price * 0.9;}
double price = 100;ApplyDiscount(price);Console.WriteLine(price); // 100100El precio sigue siendo 100. El método no da ningún error, y aun así el descuento no está. ¿Adónde fue?
Míralo
El método recibe una copia
static void ApplyDiscount(double price){ price = price * 0.9;}
double price = 100;ApplyDiscount(price);Console.WriteLine(price); // 100Paso a paso, en palabras
- En Main hay una variable price = 100.
- Llamas a ApplyDiscount(price): se reserva memoria nueva para el método.
- El valor se copia en su parámetro price.
- El método rebaja su copia: 100 * 0.9 = 90.
- El método termina y su memoria desaparece, junto con la copia.
- Y price en Main sigue siendo 100.
Al llamarlo, el método no recibe la variable price en sí, sino una copia de su valor. Rebaja la copia. Cuando el método termina, su memoria desaparece, y la copia con ella. Esto se llama paso por valor.
Las dos variables se llaman igual (price) a propósito: es justo lo que confunde en la práctica. El nombre no importa. Cada método tiene sus propias variables.
La idea
return: el método devuelve un resultado
La solución es que el método devuelva el nuevo precio. Antes del nombre, en lugar de void, escribes el tipo del resultado (double), y en el cuerpo escribes return y el valor.
static double ApplyDiscount(double price){ return price * 0.9;}
double price = 100;price = ApplyDiscount(price);Console.WriteLine(price); // 90Paso a paso, en palabras
- En Main: price = 100.
- Llamas a ApplyDiscount(price): se reserva memoria para el método.
- El valor se copia en el parámetro price.
- return price * 0.9: el resultado es 90.
- El resultado vuelve a Main y se guarda en price.
- Ahora price en Main es 90.
La llamada ApplyDiscount(price) ahora es un valor. Puedes guardarlo en una variable (como aquí), imprimirlo o hacer cálculos con él.
Más precisamente, para curiosos
- En un método
voidtambién puedes escribirreturn;(sin valor). Simplemente termina el método.
- C# tiene además una forma de que el método cambie la propia variable de quien llama:
ref. Conout, un método devuelve un valor a través de un parámetro, a veces varios a la vez. Los dos se escriben tanto en la declaración como en la llamada:
static void UpdateValue(ref int value){ value += 5;}
static void GetLimits(out int min, out int max){ min = 1; max = 10;}
int number = 10;UpdateValue(ref number);Console.WriteLine(number);
GetLimits(out int a, out int b);Console.WriteLine(a + " " + b);151 10Úsalos poco. Un método que devuelve su resultado con return se lee más fácilmente.
Pruébalo
¿Cuál es el resultado?
El método calcula un IVA del 20% sobre el precio. ¿Qué tipo tiene que ir en el hueco?
static Vat(double price)
{
return price * 0.2;
}price * 0.2 es un número decimal, así que el resultado es double.Pruébalo
Devuelto, pero perdido
¿Qué imprimirá el programa?
static int Reserve(int seats){ seats = seats - 2; Console.WriteLine("dentro: " + seats); return seats;}
int seats = 10;Reserve(seats);Console.WriteLine("fuera: " + seats);El método cambia su copia y devuelve 8, pero nadie guarda el resultado. Para conservarlo, necesitas seats = Reserve(seats);.
La idea
return termina el método
La tienda no cobra el envío en los pedidos de 50 € o más. Si no, el envío cuesta 4,99 €:
static double ShippingCost(double total){ if (total >= 50) { return 0; } return 4.99;}
Console.WriteLine(ShippingCost(62.0));Console.WriteLine(ShippingCost(18.5));04.99En cuanto llega a return, el método termina en ese momento. Por eso, con 62 €, el segundo return no se ejecuta, y no necesitamos un else.
Un método con resultado tiene que devolver un valor en cada camino. Si quitas la última línea, el programa no compila: "not all code paths return a value".
Pruébalo
Encuentra el error
Los socios del club tienen un 10% de descuento, y los demás pagan el precio completo. Pero todos reciben el descuento. ¿En qué línea está el error?
Elige la línea con el error.
El último return es para quienes no son socios: pagan el precio completo, return price;.
Ejercicio
Métodos que calculan
Resuelve las tareas en tu editor. Cada método recibe lo que necesita como parámetros y devuelve el resultado. La impresión se hace en Main.
1. Media aritmética. El método Average(int[] values) devuelve la media de los números del array. En Main, lee del teclado cuántos números hay y después los números.
51015202530Media: 202. Número primo. El método IsPrime(int n) devuelve si el número es primo (divisible solo por 1 y por sí mismo). Para 7 devuelve True, para 12 False.
3. Temperaturas. Los métodos ToFahrenheit(double c) y ToCelsius(double f). F = C · 9 / 5 + 32. Lee una temperatura y una unidad (C o F) e imprime la temperatura convertida.
100C100 C = 212 F4. Calculadora. El método Calculate(double a, double b, char op) devuelve el resultado para +, -, * o /. La operación se elige con if.
105+10 + 5 = 155. Un triángulo con parámetro. Lo prometimos en la lección anterior. El método PrintTriangle(int height) imprime un triángulo rectángulo de asteriscos con altura height. Para 3:
** ** * *Más precisamente, para curiosos
Cuidado con 5 / 9 en la fórmula de Celsius. Los dos números son enteros, así que la división es entera y el resultado es 0. Escribe (f - 32) * 5 / 9: así f - 32 es un double y todo el cálculo se hace con decimales.
Ejercicio
Métodos para arrays
Cada tarea es un método que recibe un array (o una palabra) y devuelve un resultado. Al final, júntalos todos en un programa.
Sum,SumEvenySumOdd: la suma de todos los números, de los pares y de los impares del array.Reverse: devuelve un array nuevo con los números en orden inverso.MaxyMin: el número mayor y el menor.IsPalindrome(string word): si la palabra se lee igual de izquierda a derecha que de derecha a izquierda.SumDiagonalsySumDiagonalsOnce: la suma de las dos diagonales de una matriz cuadrada, contando el elemento central dos veces y una vez.- Todo junto: para el array
{ 1, 2, 3, 4, 5 }, el número 7 (conIsPrimede la tarjeta anterior), las palabras «radar» y «ABCDE» y la matriz de 3 × 3 con los números del 1 al 9.
Suma: 15, Pares: 6, Impares: 9Invertido: [5, 4, 3, 2, 1]Máx: 5, Mín: 17 es primo: Trueradar: True, ABCDE: FalseSuma con repetición: 30, Suma sin repetición: 25Test
Ponte a prueba
Lecciones relacionadas
Sección «Lecciones relacionadas»- Se basa en: Bucles · Arrays · Arrays bidimensionales · Métodos
- Continúa en: Sobrecarga · Recursión · Clases y objetos · Constructores y this
- Ejercicios sobre el tema: Métodos