Multiline String Literal en C #

¿Hay alguna manera fácil de crear una cadena de líneas múltiples literal en C #?

Esto es lo que tengo ahora:

string query = "SELECT foo, bar" + " FROM table" + " WHERE id = 42"; 

Sé que PHP tiene

 <<<BLOCK BLOCK; 

¿Tiene C # algo similar?

Puede usar el símbolo @ delante de una string para formar una literal de cadena verbatim :

 string query = @"SELECT foo, bar FROM table WHERE id = 42"; 

Tampoco tiene que escapar de los caracteres especiales cuando usa este método, a excepción de las comillas dobles, como se muestra en la respuesta de Jon Skeet.

Se llama literal literal literal en C #, y solo se trata de poner @ antes del literal. Esto no solo permite varias líneas, sino que también desactiva el escape. Entonces, por ejemplo, puedes hacer:

 string query = @"SELECT foo, bar FROM table WHERE name = 'a\b'"; 

El único factor de escape es que si desea una comilla doble, debe agregar un símbolo de comilla doble adicional:

 string quote = @"Jon said, ""This will work,"" - and it did!"; 

Otro tema que hay que tener en cuenta es el uso de literales de cadenas en cadena. Formato. En ese caso, necesitas escapar de las llaves / corchetes ‘{‘ y ‘}’.

 // this would give a format exception string.Format(@"", aMagicValue) // this contrived example would work string.Format(@"", aMagicValue) 

El problema con el uso de cadena literal que encuentro es que puede hacer que tu código se vea un poco ” raro ” porque para no tener espacios en la cadena en sí, tiene que ser completamente alineado a la izquierda:

  var someString = @"The quick brown fox..."; 

Yuck.

Entonces, la solución que me gusta usar, que mantiene todo muy bien alineado con el rest de tu código es:

 var someString = String.Join( Environment.NewLine, "The", "quick", "brown", "fox..."); 

Y, por supuesto, si solo desea dividir lógicamente líneas de una instrucción SQL como usted y realmente no necesita una nueva línea, siempre puede simplemente sustituir Environment.NewLine por " " .

Como nota al margen, con C # 6.0 ahora puede combinar cadenas interpoladas con la literal litera literal:

 string camlCondition = $@"    {(string)parameter}  "; 

¿Por qué la gente sigue confundiendo cadenas con literales de cadena? La respuesta aceptada es una gran respuesta a una pregunta diferente; no a este.

Sé que este es un tema viejo, pero vine aquí posiblemente con la misma pregunta que el OP, y es frustrante ver cómo la gente sigue malinterpretándolo. O tal vez estoy malinterpretando, no sé.

En términos generales, una cadena es una región de la memoria de la computadora que, durante la ejecución de un progtwig, contiene una secuencia de bytes que pueden asignarse a caracteres de texto. Un literal de cadena, por otro lado, es un fragmento de código fuente, aún no comstackdo, que representa el valor utilizado para inicializar una cadena más tarde, durante la ejecución del progtwig en el que aparece.

En C #, la statement …

  string query = "SELECT foo, bar" + " FROM table" + " WHERE id = 42"; 

no produce una cadena de tres líneas sino un trazador de líneas; la concatenación de tres cadenas (cada una inicializada a partir de un literal diferente), ninguna de las cuales contiene un modificador de nueva línea.

Lo que el OP parece estar preguntando -al menos lo que preguntaría con esas palabras- no es cómo introducir, en la cadena comstackda, saltos de línea que imitan a los que se encuentran en el código fuente, sino cómo dividir para mayor claridad una larga , una sola línea de texto en el código fuente sin introducir interrupciones en la cadena comstackda. Y sin requerir un tiempo de ejecución extendido, pasó a unirse a las múltiples subcadenas que provienen del código fuente. Al igual que las barras diagonales inversas dentro de una cadena de literales multilínea en javascript o C ++.

Sugerir el uso de cadenas verbatim, Nevermind StringBuilder s, String.Join o incluso funciones anidadas con reversiones de cadena y lo que no, me hace pensar que las personas realmente no están entendiendo la pregunta. O tal vez no lo entiendo

Hasta donde yo sé, C # no (al menos en la versión paleolítica que sigo usando, de la década anterior) tiene una función para producir de forma limpia literales de cadenas múltiples que se pueden resolver durante la comstackción en lugar de la ejecución.

Tal vez las versiones actuales sí lo admiten, pero pensé que compartiría la diferencia que percibo entre cadenas y literales de cadenas.

No he visto esto, así que lo publicaré aquí (si está interesado en pasar una cadena, también puede hacerlo). La idea es que puede dividir la cadena en múltiples líneas y agregar su propio contenido (también en líneas múltiples) de la forma que desee. Aquí “tableName” se puede pasar a la cadena.

  private string createTableQuery = ""; void createTable(string tableName) { createTableQuery = @"CREATE TABLE IF NOT EXISTS ["+ tableName + @"] ( [ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, [Key] NVARCHAR(2048) NULL, [Value] VARCHAR(2048) NULL )"; } 

Si no quiere espacios / líneas nuevas, la adición de cadenas parece funcionar:

 var myString = String.Format( "hello " + "world" + " i am {0}" + " and I like {1}.", animalType, animalPreferenceType ); // hello world i am a pony and I like other ponies. 

Puede ejecutar lo anterior aquí si lo desea.

Puedes usar @ y “” .

  string sourse = @"{ ""items"":[ { ""itemId"":0, ""name"":""item0"" }, { ""itemId"":1, ""name"":""item1"" } ] }"; 

Puedes usar estos dos métodos:

  private static String ReverseString(String str) { int word_length = 0; String result = ""; for (int i = 0; i < str.Length; i++) { if (str[i] == ' ') { result = " " + result; word_length = 0; } else { result = result.Insert(word_length, str[i].ToString()); word_length++; } } return result; } //NASSIM LOUCHANI public static string SplitLineToMultiline(string input, int rowLength) { StringBuilder result = new StringBuilder(); StringBuilder line = new StringBuilder(); Stack stack = new Stack(ReverseString(input).Split(' ')); while (stack.Count > 0) { var word = stack.Pop(); if (word.Length > rowLength) { string head = word.Substring(0, rowLength); string tail = word.Substring(rowLength); word = head; stack.Push(tail); } if (line.Length + word.Length > rowLength) { result.AppendLine(line.ToString()); line.Clear(); } line.Append(word + " "); } result.Append(line); return result.ToString(); } 

En SplitLineToMultiline (), necesita definir la cadena que desea usar y la longitud de la fila, es muy simple. Gracias .