Pregunta 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?


732
2017-07-08 20:03


origen


Respuestas:


Puedes usar el @ símbolo delante de un string para formar un literal literal literal:

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

Tu también no tiene que escapar personajes especiales cuando usas este método, excepto por comillas dobles como se muestra en la respuesta de Jon Skeet.


1163
2017-07-08 20:04



Se llama literal literal literal en C #, y solo es cuestión 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!";

417
2017-07-08 20:06



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(@"<script> function test(x) 
      { return x * {0} } </script>", aMagicValue)
// this contrived example would work
string.Format(@"<script> function test(x) 
      {{ return x * {0} }} </script>", aMagicValue)

89
2017-09-24 09:28



El problema con el uso de cadena literal que encuentro es que puede hacer que tu código se vea un poco "extraño"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 resto 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 sustituir Environment.NewLine para " ".


70
2017-08-07 08:20



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

string camlCondition = $@"
<Where>
    <Contains>
        <FieldRef Name='Resource'/>
        <Value Type='Text'>{(string)parameter}</Value>
    </Contains>
</Where>";

60
2017-08-13 06:58



¿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 programa, 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 compilado, que representa el valor utilizado para inicializar una cadena más tarde, durante la ejecución del programa en el que aparece.

En C #, la declaración ...

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

... no producir una cadena de tres líneas, pero 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 compilada, 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 introduciendo descansos en la cadena compilada. 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, nunca importa StringBuilders, String.Joins 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 característica para producir cadenas de varias líneas limpiamente literales eso se puede resolver durante la compilació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.


27
2017-07-17 17:08



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
                                )";
    }

10
2017-09-19 03:40



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 te gusta.


2
2018-05-13 08:11



Puedes usar @ y "".

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

0
2018-06-06 08:51



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<string> stack = new Stack<string>(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 .


-7
2018-01-31 09:05