Declarar una cadena de una sola línea looooong en C#


¿Hay una manera decente de declarar una cadena de una sola línea larga en C#, de modo que no sea imposible declarar y/o ver la cadena en un editor?

Las opciones que conozco son:

1: Déjalo correr. Esto es malo porque debido a que su cadena se desplaza a la derecha de la pantalla, por lo que un desarrollador que lee el mensaje tiene que desplazarse molesto y leer.

string s = "this is my really long string.  this is my really long string.  this is my really long string.  this is my really long string.  this is my really long string.  this is my really long string.  this is my really long string.  this is my really long string.  ";

2: @+nuevas líneas. Esto se ve bien en el código, pero introduce nuevas líneas en la cadena. Además, si si quieres que se vea bien en código, no solo obtienes nuevas líneas, sino que también obtienes espacios incómodos al principio de cada línea de la cadena.

string s = @"this is my really long string.  this is my long string.
             this line will be indented way too much in the UI. 
This line looks silly in code.  All of them suffer from newlines in the UI.";

3: "" + ... Esto funciona bien, pero es muy frustrante escribir. Si tengo que añadir media línea de texto en algún lugar tengo que actualizar todo tipo de +'s y mover el texto por todas partes.

string s = "this is my really long string.  this is my long string. " + 
           "this will actually show up properly in the UI and looks " +
           "pretty good in the editor, but is just a pain to type out " +
           "and maintain";

4: string.format or string.concat. Básicamente lo mismo que el anterior, pero sin los signos más. Tiene los mismos beneficios y desventajas.

¿Realmente no hay manera de hacer esta bien?

Author: JasonMArcher, 2009-10-14

12 answers

Depende de cómo se vaya a usar la cadena. Todas las respuestas aquí son válidas, pero el contexto es importante. Si se va a registrar la cadena larga "s", debe estar rodeada de una prueba de protección de registro, como este ejemplo de Log4net:

if (log.IsDebug) {
    string s = "blah blah blah" + 
    // whatever concatenation you think looks the best can be used here,
    // since it's guarded...
}

Si la cadena larga s se va a mostrar a un usuario, entonces la respuesta de Developer Art es la mejor opción...esos deberían estar en el archivo de recursos.

Para otros usos (generar cadenas de consulta SQL, escribir en archivos [pero considere los recursos otra vez para éstos], etc...), donde está concatenando más que solo literales, considere StringBuilder como Wael Dalloul sugiere, especialmente si su cadena podría terminar en una función que podría, en alguna fecha en un futuro lejano, ser llamada muchas, muchas veces en una aplicación de tiempo crítico (Todas esas invocaciones se suman). Hago esto, por ejemplo, cuando construyo una consulta SQL donde tengo parámetros que son variables.

Aparte de eso, no, no sepa de cualquier cosa que se vea bonita y sea fácil de escribir (aunque la sugerencia de ajuste de línea es una buena idea, puede que no se traduzca bien a herramientas de diferencias, impresiones de código o herramientas de revisión de código). Esos son los descansos. (Yo personalmente uso el enfoque de signo más para hacer que las envolturas de línea sean ordenadas para nuestras impresiones y revisiones de código).

 7
Author: Ogre Psalm33,
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
2009-10-27 17:49:34

Hay una manera. Pon tu cadena muy larga en recursos. Incluso puedes poner fragmentos largos de texto porque es donde deberían estar los textos. Tenerlos directamente en código es una mala práctica.

 60
Author: ,
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
2009-10-14 12:07:13

Si se utiliza Visual Studio

Tools > Options > Text Editor > All Languages > Word Wrap

¡Estoy seguro de que cualquier otro editor de texto (incluido el bloc de notas) podrá hacer esto!

 8
Author: stevehipwell,
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
2009-10-14 12:09:31

¿Tiene que ser definido en el archivo fuente? De lo contrario, defínelo en un recurso o archivo de configuración.

 6
Author: d91-jal,
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
2009-10-14 12:12:33

Puedes usar StringBuilder así:

StringBuilder str = new StringBuilder();
str.Append("this is my really long string.  this is my long string. ");
str.Append("this is my really long string.  this is my long string. ");
str.Append("this is my really long string.  this is my long string. ");
str.Append("this is my really long string.  this is my long string. ");
string s = str.ToString();

También puede utilizar: Archivos de texto, archivo de recursos, Base de datos y registro.

 5
Author: Wael Dalloul,
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
2009-10-14 12:12:50

Si realmente desea esta cadena larga en el código, y realmente no desea escribir la comilla final-plus-begin-quote, entonces puede intentar algo como esto.

string longString = @"Some long string, 
    with multiple whitespace characters 
    (including newlines and carriage returns)
    converted to a single space
    by a regular expression replace.";

longString = Regex.Replace(longString, @"\s+", " ");
 5
Author: John Fisher,
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
2009-10-21 02:58:18

Personalmente leería una cadena tan grande de un archivo tal vez un documento XML.

 3
Author: James,
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
2009-10-14 12:26:24

Para cadenas realmente largas, lo almacenaría en XML (o un recurso). Para las ocasiones en las que tiene sentido tenerlo en el código, utilizo la concatenación de cadena multilínea con el operador +. El único lugar que se me ocurre donde hago esto, sin embargo, es en mis pruebas unitarias para el código que lee y analiza XML, donde en realidad estoy tratando de evitar el uso de un archivo XML para las pruebas. Dado que es una prueba unitaria, casi siempre quiero tener la cadena allí para referirse también. En esos casos podría segregarlos todos en una directiva # region para que pueda mostrarlos/ocultarlos según sea necesario.

 2
Author: tvanfosson,
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
2009-10-14 12:40:15

Podría usar StringBuilder

 1
Author: Jimmeh,
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
2009-10-14 12:08:40

Simplemente lo dejo correr, o uso string.formatee y escriba la cadena en una línea (el método let it run) pero coloque cada uno de los argumentos en una nueva línea, lo que hace que sea más fácil de leer, o al menos le da al lector alguna idea de lo que puede esperar en la cadena larga sin leerla en detalle.

 0
Author: David Božjak,
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
2009-10-14 12:11:52

Si realmente necesitas mantenerlo en el código, entonces qué tal @+nuevas líneas y luego una función simple para eliminar las nuevas líneas.

 0
Author: Hassan Voyeau,
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
2009-10-14 13:41:04

Utilice el Project / Properties / Settings del menú superior de Visual Studio. Haga el scope = "Application".

En el cuadro de valor puede introducir cadenas muy largas y como una línea de bonificación se conservan los feeds. Entonces tu código puede referirse a esa cadena de la siguiente manera:

string sql = Properties.Settings.Default.xxxxxxxxxxxxx;

 0
Author: Max Drawbaugh,
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
2018-03-09 17:55:59