Ejercicio: Valores devueltos y parámetros de los métodos
- 18 minutos
En la unidad anterior, hemos usado un escenario de codificación "tirada de dados" para ilustrar la diferencia entre los métodos con estado (instancia) y sin estado (estáticos). Ese mismo escenario puede ayudarnos a comprender otros conceptos importantes sobre la llamada a métodos. Por ejemplo:
- control del valor devuelto de un método.
- Parámetros de método y paso de argumentos a un método.
- elección de una versión sobrecargada de un método.
Valores devueltos
Algunos métodos están diseñados para completar su función y finalizar "silenciosamente". En otras palabras, no devuelven valores cuando finalizan. Se hace referencia a ellos como métodos nulos (void).
Otros métodos están diseñados para devolver un valor al finalizar. El valor devuelto suele ser el resultado de una operación. Un valor devuelto es la forma principal de comunicación de un método con el código que lo llama.
Ha visto que el método Random.Next() devuelve un tipo int que contiene el valor del número generado aleatoriamente. Sin embargo, un método se puede diseñar para devolver cualquier tipo de datos, e incluso otra clase. Por ejemplo, la clase String tiene algunos métodos que devuelven una cadena, otros que devuelven un entero y otros que devuelven un valor booleano.
Al llamar a un método que devuelve un valor, a menudo asignaremos el valor devuelto a una variable. De este modo, podremos usar el valor más adelante en el código. En el escenario de los dados, asignamos el valor devuelto de Random.Next() a la variable roll:
int roll = dice.Next(1, 7);
En algunos casos querremos usar el valor devuelto directamente, sin asignarlo a una variable. Por ejemplo, que deseemos imprimir el valor devuelto en la consola de la siguiente manera:
Console.WriteLine(dice.Next(1, 7));
Aunque un método devuelve un valor, podemos llamarlo sin usar el valor devuelto. Por ejemplo, podemos omitir el valor devuelto si llamamos al método de la siguiente manera:
dice.Next(1, 7);
Sin embargo, omitir el valor devuelto sería inútil. El motivo por el que llamamos al método Next() es que podamos recuperar el siguiente valor aleatorio.
Parámetros y argumentos de método en la instrucción que realiza la llamada
Al llamar a un método, puede pasar valores que el método usará para completar su tarea. Estos valores se denominan argumentos. El método usa los argumentos para asignar valores a los parámetros que se han definido en la firma del método. Un método puede requerir uno o varios parámetros para realizar su tarea o ninguno en absoluto.
Nota:
A menudo, los términos 'parameter' y 'argument' se usan indistintamente. Sin embargo, "parámetro" hace referencia a la variable que se usa dentro del método. El "argumento" es el valor que se pasa cuando se llama al método.
La mayoría de los métodos están diseñados para aceptar uno o más parámetros. Los parámetros se pueden usar para configurar cómo realiza su trabajo el método, o también se puede trabajar sobre ellos directamente. Por ejemplo, el método Random.Next() usa parámetros para configurar los límites superior e inferior del valor devuelto. Sin embargo, el método Console.WriteLine() usa el parámetro directamente al imprimir el valor en la consola.
Los métodos usan una firma de método para definir el número de parámetros que aceptará el método, así como el tipo de datos de cada parámetro. La instrucción de codificación que llama al método debe cumplir los requisitos especificados por la firma del método. Algunos métodos proporcionan opciones para el número y el tipo de parámetros que acepta el método.
Cuando un autor de llamada invoca el método, proporciona valores específicos, llamados argumentos, para cada parámetro. Los argumentos deben ser compatibles con el tipo de parámetro. Sin embargo, el nombre del argumento, si se usa uno en el código que realiza la llamada, no tiene por qué ser el mismo que el nombre del parámetro definido en el método.
Observe el código siguiente:
Random dice = new Random();
int roll = dice.Next(1, 7);
Console.WriteLine(roll);
La primera línea de código crea una instancia de la clase Random denominada dice. La segunda línea de código usa el método dice.Next(1, 7) para asignar un valor aleatorio a un entero denominado roll. Observe que la instrucción de llamada proporciona dos argumentos separados por un símbolo ,. El método Next() incluye una firma de método que acepta dos parámetros de tipo int. Estos parámetros se usan para configurar los límites inferiores y superiores para el número aleatorio que se devuelve. La línea de código final usa el método Console.WriteLine() para imprimir el valor de roll en la consola.
Los argumentos que se pasan a un método deben ser del mismo tipo de datos que los parámetros correspondientes definidos por el método. Si intenta pasar un argumento escrito incorrectamente a un método, el compilador de C# detectará el error y le obligará a actualizar la instrucción de llamada antes de que el código se compile y ejecute. C# y .NET usan la comprobación de tipos para evitar que los usuarios finales experimenten errores en tiempo de ejecución.
Nota:
Aunque a menudo se usan parámetros, no todos los métodos los requieren para completar su tarea. Por ejemplo, la clase Console incluye un método Console.Clear() que no usa parámetros. Dado que este método se usa para borrar cualquier información mostrada en la consola, no necesita parámetros para completar su tarea.
Métodos sobrecargados
Muchos métodos de la biblioteca de clases .NET tienen firmas de método sobrecargadas. Entre otras cosas, esto permite llamar al método con o sin argumentos especificados en la instrucción de llamada.
Un método sobrecargado se define con varias firmas de método. Los métodos sobrecargados proporcionan diferentes maneras de llamar al método o proporcionan distintos tipos de datos.
En algunos casos, se usan versiones sobrecargadas de un método para definir un parámetro mediante diferentes tipos de datos. Por ejemplo, el método Console.WriteLine() tiene 19 versiones sobrecargadas diferentes. La mayoría de esas sobrecargas permiten al método aceptar diferentes tipos y escribir la información especificada en la consola. Observe el código siguiente:
int number = 7;
string text = "seven";
Console.WriteLine(number);
Console.WriteLine();
Console.WriteLine(text);
En este ejemplo, está invocando tres versiones sobrecargadas independientes del método WriteLine().
- El primer método
WriteLine()usa una firma de método que define un parámetroint. - El segundo método
WriteLine()usa una firma de método que define cero parámetros. - El tercer método
WriteLine()usa una firma de método que define un parámetrostring.
En otros casos, las versiones sobrecargadas de un método definen un número diferente de parámetros. Se pueden usar parámetros alternativos para proporcionar más control sobre el resultado deseado. Por ejemplo, el método Random.Next() tiene versiones sobrecargadas que permiten establecer varios niveles de restricción en el número generado aleatoriamente.
En el ejercicio siguiente se llama al método Random.Next() para generar valores enteros aleatorios con distintos niveles de restricción:
Asegúrese de que tiene un archivo Program.cs vacío abierto en Visual Studio Code.
Si es necesario, abra Visual Studio Code y, luego, lleve a cabo los pasos siguientes para preparar un archivo Program.cs en el editor:
En el menú Archivo , seleccione Abrir carpeta.
Use el cuadro de diálogo "Abrir carpeta" para ir a la carpeta CsharpProjects.
En la vista EXPLORADOR de Visual Studio Code, seleccione Program.cs.
En el menú Selección de Visual Studio Code, seleccione Seleccionar todo y presione la tecla Eliminar.
Para examinar las versiones sobrecargadas del método
Random.Next(), escriba el código siguiente:Random dice = new Random(); int roll1 = dice.Next(); int roll2 = dice.Next(101); int roll3 = dice.Next(50, 101); Console.WriteLine($"First roll: {roll1}"); Console.WriteLine($"Second roll: {roll2}"); Console.WriteLine($"Third roll: {roll3}");En el menú Archivo de Visual Studio Code, haga clic en Guardar.
En la vista EXPLORER, para abrir un terminal en la ubicación de la carpeta TestProject, haga clic con el botón derecho en TestProject y, a continuación, seleccione Abrir en terminal integrado.
Asegúrese de que la ruta de acceso de carpeta mostrada en el símbolo del sistema apunta a la carpeta que contiene el archivo Program.cs.
En la ventana de comandos de Terminal, para ejecutar tu código, escribe dotnet run y presiona la tecla Enter.
Observe que el resultado es similar a la salida siguiente:
First roll: 342585470 Second roll: 43 Third roll: 89Los números generados son aleatorios, por lo que los resultados serán diferentes. Sin embargo, en este ejemplo se muestra el intervalo de resultados que puede ver.
Dedique un minuto a examinar el código.
La primera versión del método
Next()no establece un límite superior e inferior, de modo que el método devolverá valores comprendidos entre0y2,147,483,647, que es el valor máximo queintpuede almacenar.La segunda versión del método
Next()especifica el valor máximo como límite superior, por lo que en este caso podemos esperar un valor aleatorio entre0y100.La tercera versión del método
Next()especifica el valor mínimo y el valor máximo, por lo que en este caso podemos esperar un valor aleatorio entre50y100.Cierre el panel del terminal.
Ya hemos examinado varios temas en esta unidad. Esta es una lista rápida de lo que hemos tratado:
- Hemos examinado cómo usar el valor devuelto de un método (cuando el método lo proporciona).
- Ha examinado cómo un método puede usar parámetros definidos como tipos de datos específicos.
- Ha examinado las versiones sobrecargadas de algunos métodos que incluyen distintos parámetros o tipos de parámetros.
Uso de IntelliSense
Visual Studio Code incluye características de IntelliSense con tecnología de un servicio de lenguaje. Por ejemplo, el servicio de lenguaje C# proporciona finalizaciones de código inteligentes basadas en la semántica del lenguaje y un análisis del código fuente. En esta sección usaremos IntelliSense para ayudarnos a implementar el método Random.Next().
Dado que IntelliSense se expone en el editor de código, puede aprender mucho sobre un método sin salir del entorno de codificación. IntelliSense proporciona sugerencias e información de referencia en una ventana emergente bajo la ubicación del cursor de mientras escribimos el código. Al escribir código, la ventana emergente de IntelliSense cambiará su contenido en función del contexto.
Por ejemplo, a medida que escribimos la palabra dice lentamente, IntelliSense nos muestra todas las palabras clave de C#, los identificadores (o, en su lugar, los nombres de las variables del código) y las clases de la biblioteca de clases .NET que coincidan con las letras que estamos escribiendo. Podemos usar las características de Autocompletar del editor de código para terminar de escribir la palabra que se encuentra en la parte superior de la ventana emergente de IntelliSense. Pruébelo.
Asegúrese de que tiene el archivo Program.cs abierto en Visual Studio Code.
La aplicación debe contener el código siguiente:
Random dice = new Random(); int roll1 = dice.Next(); int roll2 = dice.Next(101); int roll3 = dice.Next(50, 101); Console.WriteLine($"First roll: {roll1}"); Console.WriteLine($"Second roll: {roll2}"); Console.WriteLine($"Third roll: {roll3}");En la parte inferior del archivo de código, para experimentar con IntelliSense, escriba lentamente las letras
d,iyc.Observe la ventana emergente de IntelliSense que aparece al empezar a escribir.
Cuando IntelliSense emerge, debe aparecer una lista de sugerencias. En el momento en que haya introducido
dic, el identificadordicedebe estar en la parte superior de la lista.Presione la tecla Tab del teclado.
Observe que toda la palabra
dicese completa en el editor. Podemos usar las teclas de flecha arriba y abajo para cambiar la selección antes de presionar la tecla Tab.Nota:
Si desaparece la ventana de IntelliSense, puede seleccionar la tecla
backspaceen el teclado y volver a escribir el último símbolo para volver a abrirlo.Para especificar el operador de acceso a miembros, escriba un carácter
..Observe que el elemento emergente IntelliSense vuelve a aparecer al escribir
.y muestra una lista sin filtrar de todos los métodos (y otros miembros de la clase) disponibles.Escriba N.
La lista se filtrará y la palabra
Nextdebe ser la opción de selección superior.Para autocompletar toda la palabra, presione la tecla Tab.
Para especificar el operador de invocación de método, escriba (
Observe que el paréntesis de cierre se agrega automáticamente.
El operador de invocación de método es el conjunto de paréntesis situado a la derecha del nombre del método. Esta parte de la instrucción de llamada es donde se especifican los argumentos que se pasarán al método. El operador de invocación de método es necesario al llamar al método.
Observe que el elemento emergente IntelliSense ahora muestra información detallada sobre el método
Random.Next().Dedíquele un minuto a examinar el elemento emergente IntelliSense para el método
Random.Next().Nota:
Si el elemento emergente IntelliSense se cerró antes de poder examinarlo, elimine el operador de invocación
()y, a continuación, escriba ( para mostrarlo de nuevo.Observe que la ventana emergente incluye tres secciones, una a la izquierda y dos a la derecha.
En el lado derecho, debería ver
int Random.Next()en la sección superior yReturns a non-negative random integer.en la sección inferior.intdefine el tipo de valor devuelto para el método. En otras palabras, al ejecutar esta versión del método, devolverá un valor de tipoint.En el lado izquierdo del elemento emergente IntelliSense, se muestra
1/3.1/3indica que está examinando la primera de tres firmas de método para el métodoNext(). Observe que esta versión de la firma del método permite que el método funcione sin parámetros (no se pasan argumentos al método en la instrucción que realiza la llamada).Observe también que hay una pequeña flecha por encima y por debajo de
1/3.Para examinar la segunda versión sobrecargada del método, presione la tecla de flecha hacia abajo del teclado.
Observe que puede usar las teclas de flecha arriba y abajo para navegar entre las distintas versiones sobrecargadas. Cuando lo haga, verá que
1/3,2/3y3/3aparecen en el lado izquierdo del elemento emergente IntelliSense y explicaciones útiles, a la derecha.Dedíquele un minuto a examinar cada una de las versiones sobrecargadas del método
Random.Next().La segunda versión sobrecargada del método
2/3le informa de que el métodoNext()puede aceptar un parámetroint maxValue. La descripción indica quemaxValuees el límite superior exclusivo para el número que desea que genere el métodoNext(). Exclusive indica que el número devuelto será menor que maxValue. Por lo tanto, cuando especifiquedice.Next(1,7);, la tirada máxima de los dados será 6. Observe que el mensaje de la parte inferior de la sección se ha actualizado aReturns a non-negative random integer that is less than the specified maximum..La tercera versión del método (
3/3) le informa de que el métodoNext()puede aceptarint minValueeint maxValuecomo parámetros. El nuevo parámetro,minValue, es un límite inferior para el número que desea que genere el métodoNext(). Puesto que el límite inferior es inclusivo en lugar de exclusivo, el valor devuelto puede ser igual aminValue. El mensaje de la parte inferior ahora indicaReturns a random integer that is within a specified range..En este caso, IntelliSense proporciona toda la información necesaria para seleccionar la sobrecarga adecuada, incluida una explicación detallada de
maxValueyminValue. Sin embargo, es posible que encontremos situaciones en las que necesitemos consultar la documentación del método.
Uso de learn.microsoft.com para obtener información sobre los métodos sobrecargados
La segunda forma de obtener información sobre las versiones sobrecargadas de los métodos es consultar la documentación del método. La documentación también le ayudará a comprender exactamente para qué sirve cada parámetro.
Para comenzar, abramos el explorador web y el motor de búsqueda preferidos.
Búsqueda de C# Random.Next()
La búsqueda debe incluir el nombre de clase y el nombre del método. También puede que desee incluir el término
C#para asegurarse de que accidentalmente no obtiene resultados de otros lenguajes de programación.Seleccione el resultado de búsqueda superior con una dirección URL que comienza por
https://learn.microsoft.com.Uno de los principales resultados de la búsqueda debe conducirle a una dirección URL que comience por
https://learn.microsoft.com. En este caso, el título del vínculo debe aparecer comoRandom.Next Method.Este es el vínculo en caso de que tenga un problema para encontrarlo con un motor de búsqueda:
Abra el vínculo de C# Random.Next().
Examine rápidamente la documentación.
Desplácese hacia abajo por el contenido de la página para ver los distintos ejemplos de código. Observe que puede ejecutar los ejemplos en la ventana del explorador.
La documentación de learn.microsoft.com sigue un formato estándar para cada clase y método de la biblioteca de clases .NET.
Cerca de la parte superior de la página web, ubique la sección Sobrecargas.
Observe que se enumeran tres versiones sobrecargadas del método. Cada versión sobrecargada que aparece incluye un hipervínculo a una ubicación más abajo en la página.
Para navegar "en la página" a una descripción de la segunda versión sobrecargada, seleccione Next(Int32).
La documentación de cada versión del método incluye:
- Breve descripción de la funcionalidad del método
- Definición del método
- Parámetros que acepta el método
- Valores devueltos
- Excepciones que se pueden producir
- Ejemplos de uso del método
- Otros comentarios sobre el método
Tómese un minuto para revisar la sección Parámetros.
En la sección Parámetros, puede leer que el parámetro
maxValuees el "límite superior exclusivo del número aleatorio que se va a generar". Un límite superior exclusivo significa que si desea números no mayores que10, debe pasar el valor11.También podemos leer en la línea siguiente: "
maxValuedebe ser mayor o igual que 0". ¿Qué ocurre si omitimos esta instrucción? En la sección Excepciones vemos que el método devolveráArgumentOutOfRangeExceptioncuandomaxValuesea menor que 0.Nota:
El contenido de learn.microsoft.com es el "origen de la verdad" para la biblioteca de clases .NET. Es importante dedicar tiempo a leer la documentación para comprender cómo funcionará un método determinado.
Resumen
- Los métodos pueden aceptar varios parámetros o ninguno, en función de cómo se hayan diseñado e implementado. Al pasar varios parámetros, se separan con el símbolo
,. - Los métodos pueden devolver un valor cuando completan su tarea, o pueden no devolver nada (métodos nulos o "void").
- Los métodos sobrecargados admiten varias implementaciones del método, cada una con una firma de método única (el número de parámetros y el tipo de datos de cada parámetro).
- IntelliSense nos ayuda a escribir código más rápidamente. Esto proporciona una referencia rápida a los métodos, sus valores devueltos, sus versiones sobrecargadas y los tipos de sus parámetros.
- learn.microsoft.com es la referencia principal cuando se desea obtener información sobre cómo funcionan los métodos de la biblioteca de clases .NET.