Literal de Cadena Multilínea en C#


¿Hay una manera fácil de crear un literal de cadena multilínea en C#?

Esto es lo que tengo ahora:

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

Sé que PHP tiene

<<<BLOCK

BLOCK;

¿C# tiene algo similar?

Author: Chet, 2009-07-09

10 answers

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

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

También no tiene que escapar caracteres especiales cuando usa este método, excepto por comillas dobles como se muestra en la respuesta de Jon Skeet.

 1191
Author: John Rasch,
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-07-08 20:19:21

Se llama a cadena literal literal en C#, y es solo cuestión de poner @ antes del literal. Esto no solo permite múltiples líneas, sino que también desactiva el escape. Por ejemplo, puedes hacer:

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

La única forma de escapar es que si quieres una comilla doble, tienes que añadir un símbolo extra de comilla doble:

string quote = @"Jon said, ""This will work,"" - and it did!";
 433
Author: Jon Skeet,
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
2017-11-22 09:55:39

Otro punto a tener en cuenta es el uso de literales de cadena en cadena.Formato. En ese caso, debe escapar de las llaves / llaves ' {'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)
 91
Author: Martin Clarke,
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-11-12 16:32:36

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

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

Puaj.

Así que la solución que me gusta usar, que mantiene todo bien alineado con el resto de su código es:

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

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

 75
Author: dav_i,
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
2015-04-14 21:40:29

Como nota lateral, con C # 6.0 ahora puede combinar cadenas interpoladas con el literal de cadena textual:

string camlCondition = $@"
<Where>
    <Contains>
        <FieldRef Name='Resource'/>
        <Value Type='Text'>{(string)parameter}</Value>
    </Contains>
</Where>";
 68
Author: Heliac,
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
2016-02-20 18:35:36

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

Sé que este es un viejo tema, pero yo vine aquí con, posiblemente, la misma pregunta que el OP, y es frustrante ver cómo la gente mantener malinterpretando. O tal vez lo estoy malinterpretando, no lo 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 ser mapeado a caracteres de texto. Un literal de cadena, por otro lado, es una pieza de código fuente, aún no compilada, 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 produce una cadena de tres líneas sino una línea; 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 estaría preguntando con esas palabras-no es cómo introducir, en la cadena compilada, saltos de línea que imitan los encontrados en el código fuente, sino cómo romper para mayor claridad una línea larga y única de texto en el código fuente sin introducir saltos en la cadena compilada. Y sin requerir un tiempo de ejecución extendido, pasó a unir las múltiples subcadenas procedentes del código fuente. Como las barras invertidas finales dentro de un literal de cadena multilínea en javascript o C++.

Sugerir el uso de cadenas literales, nevermind StringBuilders, String.Joins o incluso funciones anidadas con reversiones de cadenas y lo que no, me hace pensar que la gente realmente no está entendiendo la pregunta. O tal vez no lo entiendo.

Por lo que sé, C# no tiene (al menos en la versión paleolítica que todavía estoy usando, de la década anterior) una característica para producir limpiamente cadenas multilíneas literales que puedan resolverse durante la compilación en lugar de ejecución.

Tal vez las versiones actuales lo soportan, pero pensé en compartir la diferencia que percibo entre cadenas y literales de cadena.

 28
Author: Carvo Loco,
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
2016-07-17 17:08:57

No he visto esto, así que lo publicaré aquí (si está interesado en pasar una cadena, también puede hacerlo.) La idea es que usted puede romper la cadena en varias líneas y añadir su propio contenido (también en varias líneas) de la manera 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
                                )";
    }
 11
Author: RobertHana,
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
2014-09-19 03:40:37

Si no desea espacios/nuevas líneas, 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 el anterior aquí si lo desea.

 2
Author: rattray,
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
2015-05-13 08:11:59

Puede utilizar @ y "".

        string sourse = @"{
        ""items"":[
        {
            ""itemId"":0,
            ""name"":""item0""
        },
        {
            ""itemId"":1,
            ""name"":""item1""
        }
        ]
    }";
 0
Author: vovkas,
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-06-06 08:51:33

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 . Agradecer .

 -7
Author: nassimlouchani,
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
2016-01-31 09:05:42