2009-10-14 17 views
27

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

Las opciones yo sepa son:

1: Deje que se ejecute. Esto es malo porque debido a que su cadena se encuentra a la derecha de la pantalla, hacer que un desarrollador lea el mensaje tenga que desplazarse y leer molesto.

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: @ + newlines. Esto se ve bien en el código, pero introduce nuevas líneas en la cadena. Además, si quiere que se vea bien en el código, no solo obtendrá líneas nuevas, sino que también obtendrá espacios incómodos al comienzo 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 para escribir. Si necesito agregar el texto de la mitad de una línea en algún lado, tengo que actualizar todo tipo de + 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 arriba, pero sin los signos más. Tiene los mismos beneficios y desventajas.

¿Realmente no hay forma de hacerlo bien?

Respuesta

7

Depende de cómo va a terminar la cuerda. Todas las respuestas aquí son válidas, pero el contexto es importante. Si cadena larga "s" va a estar conectado, debería estar rodeado con una prueba de guardia de la tala, como este ejemplo 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 larga cadena s va a ser representada a un usuario, a continuación, Developer Art es la mejor opción ... esas deberían estar en el archivo de recursos.

Para otros usos (que generan cadenas de consulta SQL, la escritura a los archivos [pero tenga en cuenta los recursos de nuevo por estos], etc ...), en el que se concatenando algo más que literales, considere StringBuilder como Wael Dalloul sugiere, especialmente si su cadena posiblemente terminara en una función que solo puede ser llamada en un futuro lejano muchas veces en una aplicación de tiempo crítico (todas esas invocaciones se suman). Lo hago, por ejemplo, cuando construyo una consulta SQL donde tengo parámetros que son variables.

Aparte de eso, no sé de nada que se vea bonito y fácil de escribir (aunque la sugerencia de ajuste de palabras es una buena idea, puede que no se traduzca bien en herramientas de diferencias, impresiones de códigos, o herramientas de revisión de código). Esos son los descansos. (Personalmente utilizo el enfoque de signo positivo para hacer que las copias de línea sean ordenadas para nuestras impresiones y revisiones de código).

+3

La concatenación de los literales de cadena es manejada por el compilador de C#, por lo que no hay sobrecarga en el tiempo de ejecución para usar una cadena declarada como '" x "+" y "+" Z "+ ...' –

+0

¡Ah, @ 280Z28 es, por supuesto, correcto! Agregué algunas aclaraciones sobre cuándo usar el enfoque StringBuilder (cuando tienes variables mezcladas con tus ideas). –

59

Hay una manera. Pon tu larga cadena de recursos. Incluso puede poner largas piezas de texto porque es donde deberían estar los textos. Tenerlos directamente en el código es una mala práctica real.

+6

me gusta cambiar mi esquema de color VS por lo que las cadenas se muestran en un poco de color horrible. Siempre me recuerda que algo malo está sucediendo. – DavidGouge

+0

Mala práctica sí, pero no siempre se puede reparar en el software heredado (donde el administrador del proyecto no ha visto la luz). – stevehipwell

+1

@ Stevo3000: Creo que el autor de la pregunta está en condiciones de arreglarlo. Es por eso que él pide un consejo. –

-1

Usted podría utilizar StringBuilder

8

Si se utiliza Visual Studio

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

Estoy seguro que cualquier otro editor de texto (incluyendo el bloc de notas) será capaz de hacer esto!

+0

Me gusta esa opción para el código, pero no para grandes cadenas como esta – MartW

+0

@CodeByMoonlight - ¿Qué es una cadena larga en el código fuente pero el código?No estoy diciendo que sea el enfoque correcto, ¡pero hace lo que dice en la lata! Personalmente, ¡almacenaba cadenas como un recurso! – stevehipwell

+0

Utilizo esta opción constantemente, simplemente se siente mal para cadenas largas que pueden cubrir varias pantallas. La opción de recursos es mejor, como se ha dicho. – MartW

0

O simplemente lo dejo ejecutar, o uso string.format y escribo la cadena en una línea (el método let it run) pero pongo cada uno de los argumentos en una nueva línea, lo que hace que sea más fácil de leer, o en al menos dé al lector una idea de lo que puede esperar en la larga cadena sin leerlo en detalle.

+0

Alternativamente, divida la cadena realmente larga y use 'string.Concat' para unir las piezas. Eso evita el excesivo '+' -ness del lado derecho :-) – Joey

6

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

5

puede utilizar StringBuilder como esto:

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: Los archivos de texto, archivos de recursos, base de datos y registro.

+0

No sé por qué esta respuesta fue calificada tan baja. Tiene un código de ejemplo y usar StringBuilder es una buena práctica, ya que en muchas concatenaciones, es más eficiente. –

+0

Porque en esta situación solo agrega una complicación innecesaria. – MartW

+0

No estoy seguro de que haya suficiente contexto en la pregunta para determinar la situación. ¿Es este un mensaje único en la puesta en marcha de la aplicación? ¿O es un mensaje de registro en un método llamado 100 veces por segundo? En ese caso, el rendimiento importa. Mediciones de rendimiento real de referencia: http://blog.briandicroce.com/2008/02/04/stringbuilder-vs-string-performance-in-net/ –

3

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

2

Para cadenas muy largas, las almacenaba en XML (o un recurso). Para ocasiones en las que tiene sentido tenerlo en el código, uso la concatenación de cadenas de línea múltiple con el operador +. Sin embargo, el único lugar en el que puedo pensar dónde hago esto es en las pruebas de mi unidad para código que lee y analiza XML, donde estoy tratando de evitar el uso de un archivo XML para probar. Como es una prueba unitaria, casi siempre quiero tener la cuerda allí para referirme también. En esos casos, podría segregarlos a todos en una directiva #region para que pueda mostrar/ocultar según sea necesario.

0

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

4

Si realmente quiere esta larga cadena en el código, y que realmente no desea escribir el final comilla-más-comenzar-presupuesto, entonces usted 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+", " "); 
0

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

En el cuadro Valor, puede ingresar cadenas muy largas y, como bonificación, se conservan las alimentaciones de línea. A continuación, el código se puede referir a la cadena como esta:

string sql = Properties.Settings.Default.xxxxxxxxxxxxx;

Cuestiones relacionadas