Ejercicio: Combinación de cadenas mediante secuencias de escape de caracteres

Completado

Supongamos que le han pedido que cree un prototipo de una herramienta de línea de comandos para generar facturas en inglés y japonés. Por el momento, no hace falta que cree la funcionalidad real que genera las facturas. Solo tiene que proporcionar la interfaz de la línea de comandos a los clientes internos del departamento de facturación para que la aprueben. Su jefe le ha pedido que se asegure de agregar formato para que el progreso actual de la herramienta sea claro. También le ha solicitado que proporcione instrucciones para los usuarios japoneses sobre cómo generar facturas en japonés.

Ejercicio: Formato de cadenas literales en C#

En este ejercicio, aprenderá diferentes técnicas para mostrar caracteres especiales y agregar diferentes tipos de formato a la salida.

Secuencias de escape de caracteres

Una secuencia de caracteres de escape es una instrucción para el entorno de tiempo de ejecución para que inserte un carácter especial que afectará a la salida de la cadena. En C#, la secuencia de caracteres de escape comienza por una barra diagonal inversa \ seguida del carácter que se va a utilizar como escape. Por ejemplo, la secuencia \n agregará una nueva línea y la secuencia \t agregará una tabulación.

En el código siguiente se usan secuencias de caracteres de escape para agregar líneas nuevas y pestañas.

Console.WriteLine("Hello\nWorld!");
Console.WriteLine("Hello\tWorld!");

Si ejecuta el código, verá la salida siguiente:

Hello
World!
Hello   World!

¿Qué sucede si necesita insertar una comilla doble en una cadena literal? Si no usa la secuencia de escape de caracteres, confundirá al compilador, ya que este pensará que quiere finalizar la cadena antes de tiempo. Y, además, no entenderá el propósito de los caracteres que aparecen después de la segunda comilla doble.

Console.WriteLine("Hello "World"!");

El editor de .NET colocará una línea ondulada de color rojo debajo de World. Si intenta ejecutar el código de todos modos, verá la salida siguiente:

(1,27): error CS1003: Syntax error, ',' expected
(1,27): error CS0103: The name 'World' does not exist in the current context
(1,32): error CS1003: Syntax error, ',' expected

Para controlar esta situación, use la secuencia de escape \":

Console.WriteLine("Hello \"World\"!");

Si ejecuta el código anterior, verá la salida siguiente:

Hello "World"!

¿Qué sucede si necesita usar la barra diagonal inversa para otros propósitos, como mostrar una ruta de acceso de archivo?

Console.WriteLine("c:\source\repos");

Desafortunadamente, C# reserva la barra diagonal inversa para las secuencias de escape, por lo que si ejecuta el código, el compilador mostrará el siguiente error:

(1,22): error CS1009: Unrecognized escape sequence

El problema es la secuencia \s. \r no genera un error porque es una secuencia de escape válida para un retorno de carro. Sin embargo, no desea usar un retorno de carro en este contexto.

Para solucionar este problema, use \\ para mostrar una sola barra diagonal inversa.

Console.WriteLine("c:\\source\\repos");

Si usa una secuencia de escape con el carácter de barra diagonal inversa, se generará la salida que buscaba.

c:\source\repos

Aplicación de formato a la salida mediante secuencias de escape de caracteres

  1. Seleccione todo el código en el editor de .NET y presione la tecla Suprimir o Retroceso para eliminarlo.

  2. Para crear el prototipo de la herramienta de línea de comandos, escriba el código siguiente en el editor:

    Console.WriteLine("Generating invoices for customer \"Contoso Corp\" ... \n");
    Console.WriteLine("Invoice: 1021\t\tComplete!");
    Console.WriteLine("Invoice: 1022\t\tComplete!");
    Console.WriteLine("\nOutput Directory:\t");
    
  3. Ahora, ejecute el código. Se ve el resultado siguiente en la consola de salida:

    Generating invoices for customer "Contoso Corp" ...
    
    Invoice: 1021           Complete!
    Invoice: 1022           Complete!
    
    Output Directory:    
    

Literal de cadena textual

Un literal de cadena textual conservará todos los espacios en blanco y los caracteres sin necesidad de usar una secuencia de escape para la barra diagonal inversa. Para crear una cadena textual, use la directiva @ antes de la cadena literal.

Console.WriteLine(@"    c:\source\repos    
        (this is where your code goes)");

Observe que la cadena abarca dos líneas y que el espacio en blanco generado por esta instrucción de C# se mantiene en el resultado siguiente.

    c:\source\repos    
        (this is where your code goes)

Aplicación de formato a la salida mediante literales de cadena textual

  1. Agregue la siguiente línea de código debajo del código que creó anteriormente:

    Console.Write(@"c:\invoices");
    
  2. Ahora, ejecute el código. Verá el resultado siguiente que incluye el "directorio de salida":

    Generating invoices for customer "Contoso Corp" ...
    
    Invoice: 1021           Complete!
    Invoice: 1022           Complete!
    
    Output Directory:
    c:\invoices
    

Caracteres de escape Unicode

También puede agregar caracteres codificados en cadenas literales mediante la secuencia de escape \u y, después, un código de cuatro caracteres que represente algún carácter en Unicode (UTF-16).

// Kon'nichiwa World
Console.WriteLine("\u3053\u3093\u306B\u3061\u306F World!");

Nota:

En este caso, debe tener en cuenta algunas advertencias. En primer lugar, algunas consolas como el símbolo del sistema de Windows no mostrarán todos los caracteres Unicode. Lo que harán será reemplazar esos caracteres por signos de interrogación. Además, los ejemplos que se usan aquí son UTF-16. Algunos caracteres requieren UTF-32 y, por tanto, necesitan una secuencia de escape diferente. Se trata de un asunto complicado, y en este módulo solo pretendemos mostrarle lo que se puede hacer. En función de sus necesidades, es posible que necesite dedicar bastante tiempo a familiarizarse con los caracteres Unicode y aprender a trabajar con ellos en sus aplicaciones.

Aplicación de formato a la salida mediante caracteres de escape Unicode

Para completar el prototipo de la herramienta de línea de comandos, agregará una frase en japonés que se traduce como: "Para generar facturas en japonés". A continuación, mostrará una cadena literal textual que representa un comando que el usuario puede especificar. También agregará algunas secuencias de escape para dar formato.

  1. Agregue el siguiente código a su aplicación:

    // To generate Japanese invoices:
    // Nihon no seikyū-sho o seisei suru ni wa:
    Console.Write("\n\n\u65e5\u672c\u306e\u8acb\u6c42\u66f8\u3092\u751f\u6210\u3059\u308b\u306b\u306f\uff1a\n\t");
    // User command to run an application
    Console.WriteLine(@"c:\invoices\app.exe -j");
    
  2. Para asegurarse de que el código es correcto, compárelo con lo siguiente:

    Console.WriteLine("Generating invoices for customer \"Contoso Corp\" ...\n");
    Console.WriteLine("Invoice: 1021\t\tComplete!");
    Console.WriteLine("Invoice: 1022\t\tComplete!");
    Console.WriteLine("\nOutput Directory:\t");
    Console.Write(@"c:\invoices");
    
    // To generate Japanese invoices:
    // Nihon no seikyū-sho o seisei suru ni wa:
    Console.Write("\n\n\u65e5\u672c\u306e\u8acb\u6c42\u66f8\u3092\u751f\u6210\u3059\u308b\u306b\u306f\uff1a\n\t");
    // User command to run an application
    Console.WriteLine(@"c:\invoices\app.exe -j");
    
  3. Ahora, ejecute el código. Se ve el resultado siguiente en la consola de salida:

    Generating invoices for customer "Contoso Corp" ...
    
    Invoice: 1021            Complete!
    Invoice: 1022            Complete!
    
    Output Directory:
    c:\invoices
    
    日本の請求書を生成するには:
        c:\invoices\app.exe -j
    

Resumen

Esto es lo que ha aprendido sobre el formato de las cadenas literales hasta ahora:

  • Use secuencias de escape de caracteres cuando necesite insertar un carácter especial en una cadena literal, como una tabulación \t, una nueva línea \n o una comilla doble \".
  • Use un carácter de escape para la barra diagonal inversa \\ cuando necesite usar una barra diagonal inversa en todos los demás escenarios.
  • Use la directiva @ para crear un literal de cadena textual para conservar en una cadena todo el formato de espacios en blanco y todos los caracteres de barra diagonal inversa.
  • Use \u junto con un código de cuatro caracteres para representar caracteres Unicode (UTF-16) en una cadena.
  • Es posible que los caracteres Unicode no se impriman correctamente, en función de la aplicación.