Líneas de interpolación de cadenas largas en C # 6


He encontrado que mientras que la interpolación de cadena es realmente agradable cuando se aplica a las llamadas de formato de cadena de mi base de código existente, dado el límite de columna generalmente preferido, la cadena rápidamente se vuelve demasiado larga para una sola línea. Especialmente cuando las expresiones que se interpolan son complejas. Con una cadena de formato tiene una lista de variables que puede dividir en varias líneas.

var str = string.Format("some text {0} more text {1}",
    obj1.property,
    obj2.property);

¿Alguien tiene algún medio preferido de romper estas líneas?

Supongo que podrías haga algo como:

var str = $"some text { obj1.property }" +
  " more text { obj2.property };
 87
Author: Colonel Panic, 2015-08-01

5 answers

Usted puede dividir la línea en varias líneas, pero yo diría que la sintaxis ya no se ve bien.

Necesita usar la sintaxis $@ para usar una cadena interpolada verbatim, y puede colocar nuevas líneas dentro de los parámetros {...}, así:

string s = $@"This is all {
    10
    } going to be one long {
    DateTime.Now
    } line.";

La cadena anterior no contendrá ninguna línea nueva y en realidad tendrá contenido como este:

Esto es todo 10 va a ser una línea larga 01.08.2015 23.49.47.

(nota, formato noruego)

Ahora, habiendo dicho eso, no dejaría de usar string.Format. En mi opinión, algunas de estas expresiones de interpolación de cadenas se ven muy bien, pero las más complejas comienzan a ser muy difíciles de leer. Teniendo en cuenta que a menos que uses FormattableString, el código se compilará en una llamada a String.Format de todos modos, yo diría que continúes con String.Format donde tenga sentido.

 134
Author: Lasse Vågsæther Karlsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-01 21:48:33

Puedes combinar $ y @ juntos para obtener interpolación de cadena y literal de cadena multilínea:

var str = $@"some text { obj1.property }
     more text { obj2.property }";

Pero eso te dará un NewLine carácter en el medio, por lo que podría no ser lo que quieres.

 45
Author: MarcinJuraszek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-01 18:33:55

OP pidió otra cosa, pero espero que a mucha gente que lea esta pregunta le gustaría una interpolación multilínea $"" que funcione como @"". Para ello, utilice $@""

$@"Height: {height}
Width: {width}
Background: {background}"
 9
Author: Colonel Panic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-05 14:54:56

He usado StringBuilder dentro de overridden toString() como ejemplo.

    // return employee data
    public override string ToString()
    {
        StringBuilder buffer = new StringBuilder();
        buffer.AppendLine($"Number: {EmployeeNumber}");
        buffer.AppendLine($"Name: {EmployeeName}");
        buffer.AppendLine($"Address: {PostalAddress}");
        buffer.AppendLine($"Phone: {PhoneNumber}");
        buffer.AppendLine($"Age: {EmployeeAge}");
        buffer.AppendLine($"Gender: {EmployeeGender}");
        buffer.AppendLine($"Status: {EmployeeStatus}");
        buffer.AppendLine($"Manager: {EmployeeManager}");
        buffer.AppendLine($"Start: {EmployeeStartDate.ToShortDateString()}");
        return buffer.ToString();
    }
 1
Author: Christopher Govender,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-19 08:03:18

Esto es todo:

var str = $"some text { obj1.property }" +
          $" more text { obj2.property }";

Note el segundo $ en el $"..." + $"..."

 -2
Author: CallMeLaNN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-02 17:45:38