Ejercicio: Llamada a los métodos de una clase .NET

Completado

Ya sea que se haya dado cuenta o no, ha estado llamando a métodos de C# desde su primera aplicación "¡Hola, mundo!". Esa aplicación usa el método WriteLine() de la clase Console para mostrar el mensaje "¡Hola, mundo!".

Aun así, no todas las clases y métodos se implementan de la misma manera. En esta unidad se tratarán algunas de las variantes más habituales que debe comprender al usar métodos de la biblioteca de clases .NET. Lo que es más importante, aprenderá a buscar y usar la documentación para comprender mejor cada método.

Procedimiento para llamar a métodos en la biblioteca de clases .NET

A partir de la experiencia anterior con el método Console.WriteLine(), ya debe conocer los aspectos básicos:

  • Empiece por escribir el nombre de la clase. En este caso, el nombre de clase es Console.
  • Agregue el operador de acceso al miembro, el símbolo ..
  • Agregue el nombre del método. En este caso, el nombre del método es WriteLine.
  • Agregue el operador de invocación del método, que es un conjunto de paréntesis ().
  • Por último, especifique los argumentos que se pasan al método, si hay alguno, entre paréntesis del operador de invocación de método. En este caso, se especifica el texto que desea que el método Console.WriteLine() escriba en la consola (por ejemplo, "Hello World!").

Opcionalmente, en función de cómo los desarrolladores hayan diseñado e implementado el método determinado, es posible que también necesite:

  • Pase valores adicionales como parámetros de entrada.
  • Acepte un valor devuelto.

En la unidad siguiente, examinará cómo pasar valores de entrada a un método y cómo se puede usar un método para devolver un valor a la rutina de llamada.

Aunque se puede llamar a algunos métodos de la misma manera que llamamos a Console.WriteLine(), hay otros métodos en la biblioteca de clases .NET que requieren un enfoque diferente.

Preparación del entorno de creación de código

Este módulo incluye actividades de codificación que le guiarán en el proceso de compilar y ejecutar código de ejemplo. Se recomienda realizar las actividades con Visual Studio Code como entorno de desarrollo. El uso de Visual Studio Code para estas actividades le ayudará a familiarizarse con la escritura y la ejecución de código en un entorno de desarrollador que usan los profesionales de todo el mundo.

  1. Abra Visual Studio Code.

    Puede usar el menú Inicio de Windows (o un recurso equivalente para otro sistema operativo) para abrir Visual Studio Code.

  2. En Visual Studio Code, en el menú Archivo, seleccione Abrir archivo.

  3. En el cuadro de diálogo Abrir carpeta, vaya a la carpeta Desktop de Windows.

    Si tiene una ubicación de carpeta diferente donde guarda los proyectos de código, úsela. Para este curso, lo importante es tener una ubicación fácil de encontrar y recordar.

  4. En el cuadro de diálogo Abrir carpeta, elija Seleccionar carpeta.

    Si ve un cuadro de diálogo de seguridad en el que se le pregunta si confía en los autores, seleccione .

  5. En Visual Studio Code, en el menú Terminal, seleccione Nuevo terminal.

    Observe que un símbolo del sistema en el panel Terminal muestra la ruta de acceso de la carpeta actual. Por ejemplo:

    C:\Users\someuser\Desktop>
    

    Nota

    Si está trabajando en su propio equipo, en lugar de en un entorno aislado u hospedado, y ha realizado otros módulos de Microsoft Learn de esta serie de C#, es posible que ya haya creado una carpeta de proyecto para ejemplos de código. Si este es el caso, puede omitir el siguiente paso, que es para crear una aplicación de consola en la carpeta TestProject.

  6. En el símbolo del sistema del terminal, para crear una nueva aplicación de consola en una carpeta especificada, escriba dotnet new console -o ./CsharpProjects/TestProject y presione Entrar.

    Este comando de la CLI de .NET usa una plantilla de programa de .NET para crear un nuevo proyecto de aplicación de consola de C# en la ubicación de carpeta especificada. El comando crea las carpetas CsharpProjects y TestProject y usa TestProject como nombre del archivo .csproj.

  7. En el panel EXPLORADOR, expanda la carpeta CsharpProjects.

    Debería ver la carpeta TestProject y dos archivos, un archivo de programa de C# llamado Program.cs y un archivo de proyecto de C# llamado TestProject.csproj.

  8. En el panel EXPLORADOR, para ver el archivo de código en el panel Editor, seleccione Program.cs.

  9. Elimine las líneas de código existentes.

    Usará este proyecto de consola de C# para crear, compilar y ejecutar ejemplos de código durante este módulo.

  10. Cierre el panel del terminal.

Llame a diferentes tipos de métodos en la biblioteca de clases .NET

  1. En el editor de Visual Studio Code, para crear un ejemplo de código que implemente métodos de las clases System.Random y System.Console, escriba el código siguiente:

    Random dice = new Random();
    int roll = dice.Next(1, 7);
    Console.WriteLine(roll);
    
    

    Este código simula un lanzamiento de dados mediante el método Random.Next() para generar un número y el método Console.WriteLine() para mostrar el valor.

    Nota

    Examinará el código en detalle más adelante en esta unidad.

  2. En el menú Archivo de Visual Studio Code, haga clic en Guardar.

  3. En el panel EXPLORADOR, para abrir un terminal en la ubicación de la carpeta TestProject, haga clic con el botón derecho en TestProject y seleccione abrir en terminal integrado.

    Observe que el panel del terminal incluye un símbolo del sistema que muestra una ruta de acceso de carpeta. Por ejemplo:

    C:\Users\someuser\Desktop\CsharpProjects\TestProject>

    Cuando se usa el terminal para ejecutar comandos de la CLI de .NET, esta ubicación de carpeta es donde se ejecutarán los comandos. Asegúrese de que la carpeta de código coincida con la ruta de acceso de la carpeta que se muestra en el símbolo del sistema antes de compilar o ejecutar el código.

  4. En el símbolo del sistema del terminal, para ejecutar el código, escriba dotnet run y presione Intro.

    Observe que se muestra un número entre 1 y 6 en la salida de la consola (el número de puntos en los dados). Si ejecuta el código suficientes veces, verá cada uno de los números mostrados.

  5. Dedique un minuto a examinar la sintaxis utilizada para acceder a los métodos Next() y WriteLine().

    Tenga en cuenta que usa diferentes técnicas para acceder a los métodos.

    Random dice = new Random();
    int roll = dice.Next(1, 7);
    Console.WriteLine(roll);
    
    

    En la tercera línea de código, se incluye una referencia a la clase Console y se llama directamente al método Console.WriteLine(). Sin embargo, se usa una técnica diferente para llamar al método Random.Next(). La razón por la que está usando dos técnicas distintas se debe a que algunos métodos tienen estado y otros no. El siguiente paso es examinar la diferencia entre los métodos con estado y sin estado.

Métodos con estado y sin estado

En los proyectos de desarrollo de software, el término estado se usa para describir la condición del entorno de ejecución en un momento específico en el tiempo. A medida que el código se ejecuta línea a línea, los valores se almacenan en variables. En cualquier momento durante la ejecución, el estado actual de la aplicación es la recopilación de todos los valores almacenados en la memoria.

Algunos métodos no se basan en el estado actual de la aplicación para que funcione correctamente. En otras palabras, los métodos sin estado se implementan para poder funcionar sin hacer referencia a los valores que ya están almacenados en la memoria y sin cambiarlos. Los métodos sin estado también se conocen como métodos estáticos.

Por ejemplo, el método Console.WriteLine() no se basa en ningún valor almacenado en memoria. Realiza su función y finaliza sin afectar al estado de la aplicación de ningún modo.

Otros métodos, sin embargo, deben tener acceso al estado de la aplicación para funcionar correctamente. En otras palabras, los métodos con estado se compilan de forma que dependen de los valores almacenados en memoria por líneas anteriores de código que ya se han ejecutado. O bien modifican el estado de la aplicación actualizando valores o almacenando nuevos valores en la memoria. También se conocen como métodos de instancia.

Los métodos con estado (de instancia) realizan un seguimiento de su estado en campos, que son variables definidas en la clase. Cada nueva instancia de la clase obtiene su propia copia de los campos en los que se va a almacenar el estado.

Una sola clase puede admitir métodos con y sin estado. Sin embargo, cuando necesite llamar a métodos con estado, debe crear primero una instancia de la clase para que el método pueda tener acceso al estado.

Crear una instancia de una clase

Una instancia de una clase se denomina objeto. Para crear una nueva instancia de una clase, use el operadornew. Considere la siguiente línea de código que crea una nueva instancia de la clase Random para crear un nuevo objeto denominado dice:

Random dice = new Random();

El operador new realiza varias acciones importantes:

  • Primero solicita una dirección en la memoria del equipo lo suficientemente grande como para almacenar un nuevo objeto basado en la clase Random.
  • Crea el nuevo objeto y lo almacena en la dirección de memoria.
  • Devuelve la dirección de memoria para que se pueda guardar en la variable dice.

A partir de ese momento, cuando se hace referencia a la variable dice, el runtime de .NET realiza una búsqueda en segundo plano para dar la sensación de que se está trabajando directamente con el propio objeto.

La versión más reciente del entorno de ejecución de .NET permite crear instancias de un objeto sin tener que repetir el nombre de tipo (invocación de constructor con tipo de destino). Por ejemplo, el código siguiente creará una nueva instancia de la clase Random:

Random dice = new();

La idea es simplificar la legibilidad del código. Siempre se usan paréntesis al escribir una expresión con tipo de destino new.

¿Por qué el método Next() tiene estado?

Es posible que se pregunte por qué el método Next() se implementó como un método con estado. ¿Los diseñadores de la biblioteca de clases .NET no podían haber ideado una forma de generar un número aleatorio sin que se requiera un estado? ¿Y qué almacena exactamente o a qué hace referencia el método Next()?

Son buenas preguntas. A nivel general, los equipos siguen bien las instrucciones específicas para crear un resultado repetible y confiable. Para dar sensación de aleatoriedad, los desarrolladores del método Next() decidieron capturar la fecha y el tiempo hasta la fracción de un milisegundo y usarlo para inicializar un algoritmo que genera un número diferente cada vez. Aunque no es totalmente aleatorio, es suficiente para la mayoría de las aplicaciones. El estado que se captura y se mantiene durante el tiempo de vida del objeto dice es el valor de inicialización. Cada llamada subsiguiente al método Next() vuelve a ejecutar el algoritmo, pero garantiza que el valor de inicialización cambie para que no se devuelva (necesariamente) el mismo valor.

Sin embargo, para usar el método Random.Next() no es necesario entender cómo funciona. Lo importante es saber que algunos métodos requieren que se cree una instancia de una clase antes de llamarlos, mientras que otros no.

¿Cómo se puede determinar si es necesario crear una instancia de una clase antes de llamar a sus métodos?

Un enfoque para determinar si un método es con estado o sin estado es consultar la documentación. La documentación incluye ejemplos que muestran si se debe llamar al método desde la instancia de objeto o directamente desde la clase.

Nota

Puede que deba desplazarse hacia abajo en la página de documentación para encontrar los ejemplos de código.

Como alternativa a la búsqueda a través de la documentación del producto, puede intentar acceder al método directamente desde la propia clase. Si funciona, sabe que es un método sin estado. Lo peor que puede suceder es que obtenga un error de compilación.

Intente acceder directamente al método Random.Next() y observe qué sucede.

  1. Escriba la siguiente línea de código en el editor de Visual Studio Code:

    int result = Random.Next();
    
    

    Ya sabe que Next() es un método con estado, pero en este ejemplo se muestra cómo reacciona el editor de Visual Studio Code al intentar acceder a un método de forma incorrecta.

  2. Observe que aparece una línea ondulada roja en Random.Next, lo que indica que tiene un error de compilación.

    Si el método que le interesa usar es sin estado, no aparecerá ninguna línea ondulada roja.

  3. Mantenga el puntero del mouse sobre la línea roja ondulada.

    Debe aparecer una ventana emergente con el siguiente mensaje:

    (1,14): error CS0120: An object reference is required for the non-static field, method, or property 'Random.Next()'
    
    

    Como vio en el código al principio de la unidad, puede corregir este error mediante la creación de una instancia de la clase Random antes de acceder al método Next(). Por ejemplo:

    Random dice = new Random();
    int roll = dice.Next();
    
    

    En este caso, se llama al método Next() sin parámetros de entrada.

Resumen

  • Para llamar a los métodos de una clase de la biblioteca de clases .NET, se usa el formato ClassName.MethodName(), donde el símbolo . es el operador de acceso a miembros para tener acceso a un método definido en la clase, y los símbolos () son los operadores de invocación de método.
  • Cuando se llama a un método sin estado, no es necesario crear primero una nueva instancia de su clase.
  • Al llamar a un método con estado, debe crear una instancia de la clase y tener acceso al método en el objeto.
  • Para crear una nueva instancia de una clase, use el operador new.
  • Una instancia de una clase se denomina objeto.

Comprobar los conocimientos

1.

¿Cuál de las siguientes opciones representa la manera correcta de crear una instancia de clase?

2.

Un desarrollador crea una instancia de la clase Random denominada coins. ¿Cuál de las siguientes líneas de código puede usar para implementar el método Next()?