recortar - Declarar una cadena de una sola línea looooong en C#
string.length c# (12)
¿Tiene que estar definido en el archivo fuente? De lo contrario, defínalo en un recurso o archivo de configuración.
¿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: Dejalo correr. Esto es malo porque su cadena se desplaza a la derecha de la pantalla, por lo que un desarrollador que lee el mensaje tiene que desplazarse y leer de manera molesta.
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 a la cadena. Además, si desea que se vea bien en el código, no solo obtiene nuevas líneas, sino que también obtiene 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 necesito agregar media línea de texto en algún lugar, tengo que actualizar todo tipo de + ''s y mover todo el texto.
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 manera de hacer esto bien?
Depende de cómo se vaya a usar la cuerda. Todas las respuestas aquí son válidas, pero el contexto es importante. Si se va a registrar la cadena larga "s", se debe rodear con 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 mostrará a un usuario, entonces la respuesta de Developer Art es la mejor opción ... esas deberían estar en el archivo de recursos.
Para otros usos (generar cadenas de consulta SQL, escribir en archivos [pero considere recursos nuevamente para estos], etc ...), donde concatene más que solo literales, considere StringBuilder como sugiere Wael Dalloul , especialmente si su cadena puede sonar en una función que solo puede, en alguna fecha en un futuro lejano, ser llamada 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 conozco nada que se vea bonito y que sea 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, impresión de códigos o herramientas de revisión de códigos). ). Esos son los descansos. (Personalmente, utilizo el enfoque del signo de más para hacer que las líneas se ajusten a nuestras impresiones y revisiones de código).
Hay una manera. Pon tu cadena muy larga en recursos. Incluso puedes poner textos largos porque es donde deberían estar los textos. Tenerlos directamente en el código es una verdadera mala práctica.
O bien lo dejo correr, o uso string.format y escribo la cadena en una línea (el método de ejecución), pero pongo cada uno de los argumentos en una línea nueva, 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 larga cadena sin leerlo en detalle.
Para cadenas realmente largas, lo almacenaría en XML (o un recurso). Para ocasiones en las que tenga sentido tenerlo en el código, uso la concatenación de cadenas multilínea con el operador +
. Sin embargo, el único lugar donde puedo pensar en dónde hago esto es en las pruebas de mi unidad 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. Ya que es una prueba de unidad, casi siempre quiero tener la cadena allí mismo para referirme también. En esos casos, podría separarlos a todos en una directiva #region para poder mostrarlos / esconderlos según sea necesario.
Personalmente, leería una cadena tan grande de un archivo, tal vez un documento XML.
Podrías usar StringBuilder
Puedes usar StringBuilder de esta manera:
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.
Si realmente desea esta cadena larga en el código, y realmente no desea escribir la comilla de fin de cita más el comienzo, 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+", " ");
Si usa 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.
Use el Project / Properties / Settings
del menú superior de Visual Studio. Hacer el scope = "Application"
.
En el cuadro Valor puede ingresar cadenas muy largas y, como una línea de bonificación, se conservan las fuentes. Entonces tu código puede referirse a esa cadena como esta:
string sql = Properties.Settings.Default.xxxxxxxxxxxxx;
si realmente necesitas mantenerlo en el código, entonces, ¿qué hay de @ + newlines y luego una función simple para eliminar las nuevas líneas?