Seqüência de caracteres multilinha em c #

Existe uma maneira fácil de criar um literal de seqüência de caracteres de múltiplas linhas em c #?

Aqui está o que eu tenho agora:

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

Eu sei que o PHP tem

 <<<BLOCK BLOCK; 

C # tem algo semelhante?

Você pode usar o símbolo @ na frente de uma string para formar um literal de string textual :

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

Você também não precisa escaping de caracteres especiais ao usar esse método, exceto para aspas duplas, como mostrado na resposta de Jon Skeet.

É chamado literal de string literal em C #, e é apenas uma questão de colocar @ antes do literal. Isso não apenas permite várias linhas, como também desativa o escape. Então, por exemplo, você pode fazer:

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

O único escape é que se você quiser uma aspa dupla, você deve adicionar um símbolo extra de aspas duplas:

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

Uma outra pegadinha a ser observada é o uso de literais de string em string.Format. Nesse caso, você precisa escaping de chaves / colchetes ‘{‘ e ‘}’.

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

O problema com o uso de string literal eu acho é que ele pode fazer o seu código parecer um pouco ” estranho “, porque para não obter espaços na própria string, ela deve ser completamente alinhada à esquerda:

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

Que nojo.

Então a solução que eu gosto de usar, que mantém tudo bem alinhado com o resto do seu código é:

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

E, claro, se você quiser apenas dividir logicamente as linhas de uma instrução SQL como você é e realmente não precisa de uma nova linha, você pode simplesmente replace Environment.NewLine por " " .

Como uma nota lateral, com o C # 6.0, agora você pode combinar strings interpoladas com o literal da string textual:

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

Por que as pessoas continuam confundindo strings com literais de string? A resposta aceita é uma ótima resposta para uma pergunta diferente; não para este.

Eu sei que este é um tópico antigo, mas eu cheguei aqui possivelmente com a mesma pergunta que o OP, e é frustrante ver como as pessoas continuam interpretando mal. Ou talvez eu esteja interpretando mal, eu não sei.

Grosso modo, uma string é uma região da memory do computador que, durante a execução de um programa, contém uma seqüência de bytes que podem ser mapeados para caracteres de texto. Uma string literal, por outro lado, é uma parte do código fonte, ainda não compilado, que representa o valor usado para inicializar uma string mais tarde, durante a execução do programa em que aparece.

Em c #, a declaração …

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

não produz uma corda de três linhas, mas um forro de uma linha; a concatenação de três cadeias de caracteres (cada inicializado a partir de um literal diferente) nenhuma delas contém um modificador de nova linha.

O que o OP parece estar fazendo – pelo menos o que eu estaria perguntando com essas palavras – não é como introduzir, na string compilada, quebras de linha que imitam aqueles encontrados no código-fonte, mas como dividir para esclarecer um longo , única linha de texto no código-fonte sem introduzir interrupções na string compilada. E sem exigir um tempo de execução estendido, passou a unir as várias substrings vindas do código-fonte. Como as barras invertidas finais em um literal de string de múltiplas linhas em javascript ou C ++.

Sugerir o uso de strings verbatim, nevermind StringBuilder s, String.Join s ou mesmo aninhar funções com reversões de strings e o que não, me faz pensar que as pessoas não estão realmente entendendo a questão. Ou talvez eu não entenda isso.

Até onde eu sei, o C # não tem (pelo menos na versão paleolítica que eu ainda estou usando, da década anterior) ter um recurso para produzir de forma limpa seqüências de caracteres multilinhas que podem ser resolvidas durante a compilation ao invés da execução.

Talvez as versões atuais suportem isso, mas eu pensei em compartilhar a diferença que percebi entre strings e strings literais.

Eu não vi isso, então vou postar aqui (se você estiver interessado em passar uma string, você pode fazer isso também). A idéia é que você pode quebrar a string em várias linhas e adicionar seu próprio conteúdo (também em várias linhas) da maneira que desejar. Aqui “tableName” pode ser passado para a string.

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

Se você não quer espaços / novas linhas, a adição de strings 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. 

Você pode executar o acima aqui, se quiser.

Você pode usar @ e “” .

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

Você pode usar esses dois methods:

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

No SplitLineToMultiline (), você precisa definir a string que deseja usar e o tamanho da linha, é muito simples. Obrigado .