Como inserir nova linha na string literal?

155

No .NET eu posso fornecer literais de ambos \rou de \nstring, mas existe uma maneira de inserir algo como caractere especial "nova linha" como Environment.NewLinepropriedade estática?

Captain Comic
fonte
9
Qual é a pergunta?
Iburlakov

Respostas:

319

Bem, opções simples são:

  • string.Format:

    string x = string.Format("first line{0}second line", Environment.NewLine);
  • Concatenação de string:

    string x = "first line" + Environment.NewLine + "second line";
  • Interpolação de string (em C # 6 e acima):

    string x = $"first line{Environment.NewLine}second line";

Você também pode usar \ n em qualquer lugar e substituir:

string x = "first line\nsecond line\nthird line".Replace("\n",
                                                         Environment.NewLine);

Observe que você não pode tornar essa string constante , porque o valor de Environment.NewLineestará disponível apenas no tempo de execução.

Jon Skeet
fonte
1
Bem, obrigado, é claro, mas eu quis evitar evitar o Environment.NewLine, minha pergunta era se havia literal '/ newline'.
Captain Comic
2
@ Capitão: Por que você quer evitar Environment.NewLine? Muito pelo contrário, é uma boa prática para usá-lo
abatishchev
18
@abatishchev: Em alguns lugares, é uma boa prática. Nos meus outros, não é. Você realmente precisa saber que deseja usar o específico da plataforma. Por exemplo, não é uma boa ideia se você estiver usando um protocolo de rede que deve definir os próprios terminadores de linha.
Jon Skeet
1
@Captain Comic: Minha sentença final explica por que ele não pode ser uma fuga literal - você não pode incluí-lo no metadados para uma cadeia constante, porque é não um valor constante.
Jon Skeet
1
Sim, pode ser que eu tenha relutado em causar as duas opções: uma usando o operador plus e a segunda usando o método Format são uma sobrecarga, na qual a injeção literal de '\ newline' seria a maneira mais rápida. Mas, como Jon disse, o NewLine literal, se existisse, teria que ser dinâmico e dependente da plataforma.
Captain Comic
33

Se você quiser uma string const que contenha Environment.NewLine, poderá fazer algo assim:

const string stringWithNewLine =
@"first line
second line
third line";

EDITAR

Como isso está em uma string const, isso é feito em tempo de compilação; portanto, é a interpretação do compilador de uma nova linha. Não consigo encontrar uma referência que explique esse comportamento, mas posso provar que funciona como pretendido. Compilei esse código no Windows e no Ubuntu (com Mono) e depois desmontei e estes são os resultados:

Desmontar no Windows Desmontar no Ubuntu

Como você pode ver, no Windows as novas linhas são interpretadas como \ r \ n e no Ubuntu como \ n

Tal Jerome
fonte
1
O compilador adiciona automaticamente um Environment.NewLine entre cada linha do texto. Assim, a string é interpretado como: "primeira linha" + Environment.NewLine + "segunda linha" + Environment.NewLine + "terceira linha"
Tal Jerome
3
+1 Maneira pouco conhecida de inserir novas linhas em literais de string. Existe alguma referência para o comportamento que você especificar? É realmente Environment.NewLine ou é a definição do compilador de uma nova linha?
Careta do desespero
1
Tem certeza de que não é o caractere de nova linha do editor de código inserido aí? Se você copiar e colar esse código em um editor no Windows, ele provavelmente será convertido para \ r \ n. Faça o mesmo em uma plataforma semelhante ao Unix e provavelmente será convertido para \ n.
Xiyng
Cuidado com isso. Se você fizer o checkout do código no servidor de CI / CD (como Teamcity, checkout do lado do servidor), ele mudará CRLF para LF e não haverá novas linhas na string.
Leszek P
13
var sb = new StringBuilder();
sb.Append(first);
sb.AppendLine(); // which is equal to Append(Environment.NewLine);
sb.Append(second);
return sb.ToString();
abatishchev
fonte
2
Por que você faria isso em vez de usar o first + Environment.NewLine + secondque é mais eficiente e (IMO) mais fácil de ler?
quer
@ Jon: Mais eficiente, realmente? Eu pensei que String.Formatproduziria 1 string de uma só vez (mas é internamente um pouco lento por causa de concatenações específicas da cultura, etc.), enquanto a concatenação de strings - 1 resultante + 1 temporária, certo?
precisa saber é o seguinte
1
@abatishchev: os convertidos compilador str + str + str para String.Concatenate, que constrói diretamente apenas uma cadeia de saída (IIRC, se as cordas são literais a concatenação é feito no compilador.
Richard
@ Richard: ou seja, concatenação de cadeias múltiplas mas de uma linha ( "a"+b+"c"+d, etc) por desempenho são iguais a uma única? Ou apenas convertido para String.Concatenate(a,b,c,d,etc), certo?
precisa saber é o seguinte
@abatishchev: É por isso que não sugeri string.Formatno comentário. A concatenação de cadeias não produzirá cadeias temporárias, porque o compilador chamará string.Concat(first, Environment.NewLine, second).
Jon Skeet
3

Mais uma maneira de posicionamento conveniente de Environment.NewLine na cadeia de formatação. A idéia é criar um método de extensão de string que formate a string normalmente, mas também substitui {nl} no texto por Environment.NewLine

Uso

   " X={0} {nl} Y={1}{nl} X+Y={2}".FormatIt(1, 2, 1+2);
   gives:
    X=1
    Y=2
    X+Y=3

Código

    ///<summary>
    /// Use "string".FormatIt(...) instead of string.Format("string, ...)
    /// Use {nl} in text to insert Environment.NewLine 
    ///</summary>
    ///<exception cref="ArgumentNullException">If format is null</exception>
    [StringFormatMethod("format")]
    public static string FormatIt(this string format, params object[] args)
    {
        if (format == null) throw new ArgumentNullException("format");

        return string.Format(format.Replace("{nl}", Environment.NewLine), args);
    }

Nota

  1. Se você deseja que o ReSharper destaque seus parâmetros, adicione atributo ao método acima

    [StringFormatMethod ("formato")]

  2. Esta implementação é obviamente menos eficiente do que apenas String.Format

  3. Talvez alguém que esteja interessado nesta questão também esteja interessado na próxima pergunta: Formatação de string nomeada em C #

MajesticRa
fonte
2
string myText =
    @"<div class=""firstLine""></div>
      <div class=""secondLine""></div>
      <div class=""thirdLine""></div>";

não é isso:

string myText =
@"<div class=\"firstLine\"></div>
  <div class=\"secondLine\"></div>
  <div class=\"thirdLine\"></div>";
Hakkı Eser
fonte
1
static class MyClass
{
   public const string NewLine="\n";
}

string x = "first line" + MyClass.NewLine + "second line"

fonte
3
-1: o sistema já define Environment.NewLine- veja as outras respostas.
Richard
@ Richard: OP, tanto quanto eu poderia entendê-lo, quer usar literal de cadeia inline, ou sejaconst string
abatishchev
@Richard Environment.NewLine é estático e não const
1

versões mais recentes do .net permitem que você use $ na frente do literal, o que permite usar variáveis ​​dentro da seguinte maneira:

var x = $"Line 1{Environment.NewLine}Line 2{Environment.NewLine}Line 3";
DanielK
fonte
1
Um pouco de contexto não seria ruim.
croxy
1
Isso não fornece uma resposta para a pergunta. Depois de ter reputação suficiente, você poderá comentar qualquer postagem ; em vez disso, forneça respostas que não exijam esclarecimentos do solicitante . - Da avaliação
H. Pauwelyn 26/09/16
@ H.Pauwelyn Th: Agradecido pelo feedback. Eu adicionei um pouco de contexto. Do meu ponto de vista, a solução definitivamente responde à pergunta.
DanielK
0

Se você realmente deseja que a string New Line seja uma constante, faça o seguinte:

public readonly string myVar = Environment.NewLine;

O usuário da palavra-chave somente leitura em C # significa que essa variável pode ser atribuída apenas uma vez. Você pode encontrar a documentação aqui . Permite a declaração de uma variável constante cujo valor não é conhecido até o tempo de execução.

wizard07KSU
fonte
0

Eu gosto mais do "caminho pitonico"

List<string> lines = new List<string> {
    "line1",
    "line2",
    String.Format("{0} - {1} | {2}", 
        someVar,
        othervar, 
        thirdVar
    )
};

if(foo)
    lines.Add("line3");

return String.Join(Environment.NewLine, lines);
percebus
fonte
0

Se você estiver trabalhando com aplicativos da Web, tente isso.

StringBuilder sb = new StringBuilder();
sb.AppendLine("Some text with line one");
sb.AppendLine("Some mpre text with line two");
MyLabel.Text = sb.ToString().Replace(Environment.NewLine, "<br />")
Tejas Bagade
fonte
0

Se eu entendi a pergunta: Casal "\r\n"para obter essa nova linha abaixo em a textbox. Meu exemplo funcionou -

   string s1 = comboBox1.Text;     // s1 is the variable assigned to box 1, etc.
   string s2 = comboBox2.Text;

   string both = s1 + "\r\n" + s2;
   textBox1.Text = both;

Uma resposta típica pode estar s1 s2 no text boxestilo de tipo definido usando.

Charles F
fonte
-1

Aqui, Environment.NewLine não funcionou.

Eu coloquei um " < br / > " em uma string e trabalhou.

Ex:

ltrYourLiteral.Text = "Primeira linha <. br / > segunda linha.";

Fábio
fonte