Una aplicación en C# puede leer datos del flujo de la entrada estándar utilizando algunos métodos de la clase estática Console del espacio de nombres System, como ReadLine y ReadKey.
Veamos la siguiente línea de código:
string fullName = Console.ReadLine();
Aquí se utiliza el método ReadLine. Espera hasta que el usuario presione la tecla Enter. Entonces, el texto introducido se almacena como valor de la variable de cadena fullName.
De forma similar, se pueden leer datos de otros tipos, como int, como se muestra a continuación:
string numberString = Console.ReadLine();
int.TryParse(numberString, out int number);
En este caso, se llama al mismo método ReadLine y el texto introducido se almacena como valor de la variable numberString. Luego, sólo hay que parsearlo a int y almacenarlo como valor de la variable int. ¿Cómo se puede hacer eso?
La solución es muy sencilla: utilizamos el método estático TryParse de la estructura Int32. Vale la pena mencionar que dicho método devuelve un valor Boolean, indicando si el proceso de análisis ha terminado con éxito. Por lo tanto, se puede realizar algunas acciones adicionales cuando la representación de la cadena proporcionada es incorrecta.
Un escenario similar, con respecto a la estructura DateTime y el método estático TryParseExact se muestra en el siguiente ejemplo:
string dateTimeString = Console.ReadLine();
if (!DateTime.TryParseExact(
dateTimeString,
"d/M/yyyy HH:mm",
new CultureInfo("es-ES"),
DateTimeStyles.None,
out DateTime dateTime))
{
dateTime = DateTime.Now;
}
Este ejemplo es más complicado que el anterior, así que vamos a explicarlo con detalle. En primer lugar, la representación en forma de cadena de la fecha y la hora se almacena como valor de la variable dateTimeString. A continuación, se llama al método estático TryParseExact de la estructura DateTime pasando cinco parámetros, la representación en cadena de la fecha y la hora (dateTimeString), el formato esperado de la fecha y la hora (d/M/yyyy HH:mm), la cultura soportada (es-ES), los estilos adicionales (None), así como la variable de salida (dateTime) pasada por referencia utilizando el modificador del parámetro out.
Si el análisis sintáctico no se completa con éxito, la fecha y hora actuales (DateTime.Now) se asignan a la variable dateTime. En caso contrario, la variable dateTime contiene la instancia de DateTime consistente con la representación de la cadena proporcionada por el usuario.
Además de leer toda la línea, también se puede saber qué carácter o tecla de función ha pulsado el usuario. Para ello, se puede utilizar el método ReadKey, como se muestra en la siguiente parte de código:
ConsoleKeyInfo key = Console.ReadKey();switch (key.Key)
{
case ConsoleKey.S: /* Presionado S */break;case ConsoleKey.F1: /* Presionado F1 */break;case ConsoleKey.Escape: /* Presionado Escape */break;
}
Después de llamar al método estático ReadKey y una vez que cualquier tecla ha sido presionada por un usuario, la información sobre la tecla pulsada se almacena como la instancia ConsoleKeyInfo (es decir, key, en el ejemplo actual). Entonces, se utiliza la propiedad Key para obtener un valor de enumeración (de ConsoleKey) que representa una tecla concreta. Al final, se utiliza la sentencia switch para realizar operaciones en función de la tecla que se haya pulsado. En el ejemplo mostrado se admiten tres teclas, (S, F1 y Esc).
Ahora, que ya sabemos cómo leer los datos de entrada, pero ¿cómo puede hacer preguntas al usuario o presentar los resultados en la pantalla? 🤔
Al igual que en el caso de la lectura de datos, las operaciones relacionadas con el flujo de salida estándar se realizan utilizando métodos de la clase estática Console del espacio de nombres System, concretamente Write y WriteLine. ¡Veámoslos en acción! 👨🏽💻
Para escribir un texto, basta con llamar al método Write, pasando el texto como parámetro. Un ejemplo de código es el siguiente:
Console.Write("Introduzca un nombre: ");
La línea anterior hace que se muestre la siguiente salida:
Lo importante aquí es que el texto escrito no vaya seguido del salto de línea. Si lo que se quiere es escribir algún texto y pasar a la siguiente línea, se puede utilizar el método WriteLine, como como se muestra en el siguiente fragmento de código:
Console.WriteLine("Hola!");
Después de ejecutar esta línea de código, se presenta la siguiente salida:
Por supuesto, también puede utilizar los métodos Write y WriteLine en escenarios más complejos. Por ejemplo, se puede pasar muchos parámetros al método WriteLine, concretamente el formato y los argumentos adicionales, como se muestra en la siguiente parte del código:
stringname = "Platzi";
Console.WriteLine("Hola, {0}!", name);
En este caso, la línea contendrá Hola, una coma, un espacio, un valor de la variable name (es decir es, Platzi), así como el signo de exclamación. La salida se muestra como sigue:
El siguiente ejemplo presenta un escenario bastante más complejo de escribir la línea relativa a la confirmación de una reserva de mesa en un restaurante. La salida debe tener el formato La mesa [número] ha sido reservada para [número] personas el [fecha] a las [hora]. Se puede lograr este objetivo utilizando el método WriteLine, como se muestra a continuación:
string tableNumber = "17";int peopleCount = 4;
DateTime reservationDateTime = new DateTime(
2021, 07, 29, 11, 0, 0);
CultureInfo cultureInfo = new CultureInfo("es-ES");
Console.WriteLine(
"La mesa {0} ha sido reservada para {1} personas el {2} a las {3}",
tableNumber,
peopleCount,
reservationDateTime.ToString("d/M/yyyy", cultureInfo),
reservationDateTime.ToString("HH:mm", cultureInfo));
El ejemplo comienza con la declaración de cuatro variables, tableNumber (17) peopleCount (4), y reservationDateTime (29/07/2021 a las 11:00 AM), así como cultureInfo (es-ES). A continuación, se llama al método WriteLine pasando cinco parámetros, a saber, la cadena de formato seguida de los argumentos que deben mostrarse en los lugares marcados con {0}, {1}, {2} y {3}. Cabe destacar las dos últimas líneas, donde se crea la cadena que presenta la fecha (o la hora) se crea, basándose en el valor actual de la variable reservaDateTime.
Después de ejecutar este código, se muestra la siguiente línea en la salida:
Por supuesto, en el mundo real, utilizarás métodos de lectura y escritura en el mismo código. Por ejemplo, puede pedir a un usuario que proporcione un valor (utilizando el método Write) y luego leer el texto introducido (usando el método ReadLine).
Este sencillo ejemplo, permite al usuario introducir los datos relativos a la reserva de la mesa, es decir, el número de mesa y el número de personas, así como la fecha de la reserva. Una vez introducidos todos los datos, se presenta la confirmación. Por supuesto, el usuario verá la información sobre los datos que ha proporcionado:
using System;
using System.Globalization;
namespace GettingStarted
{
class Program
{
staticvoid Main(string[] args)
{
CultureInfo cultureInfo = new CultureInfo("es-ES");
Console.Write("El numero de la mesa: ");
string table = Console.ReadLine();
Console.Write("El numero de personas: ");
string countString = Console.ReadLine();
int.TryParse(countString, out int count);
Console.Write("La fecha de reserva (dd/MM/yyyy): ");
string dateTimeString = Console.ReadLine();
if (!DateTime.TryParseExact(
dateTimeString,
"d/M/yyyy HH:mm",
cultureInfo,
DateTimeStyles.None,
out DateTime dateTime))
{
dateTime = DateTime.Now;
}
Console.WriteLine(
"La mesa {0} ha sido reservada para {1} personas el {2} a las {3}", table, count,
dateTime.ToString("d/M/yyyy", cultureInfo),
dateTime.ToString("HH:mm", cultureInfo));
}
}
}
El fragmento de código anterior se basa en las partes de código mostradas y descritas anteriormente. Tras lanzar el programa e introducir los datos necesarios, la salida podría ser la siguiente siguiente: