No .NET eu posso fornecer literais de ambos \r
ou de \n
string, mas existe uma maneira de inserir algo como caractere especial "nova linha" como Environment.NewLine
propriedade estática?
No .NET eu posso fornecer literais de ambos \r
ou de \n
string, mas existe uma maneira de inserir algo como caractere especial "nova linha" como Environment.NewLine
propriedade estática?
Respostas:
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.NewLine
estará disponível apenas no tempo de execução.
Environment.NewLine
? Muito pelo contrário, é uma boa prática para usá-lo
Se você quiser uma string const que contenha Environment.NewLine, poderá fazer algo assim:
const string stringWithNewLine =
@"first line
second line
third line";
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:
Como você pode ver, no Windows as novas linhas são interpretadas como \ r \ n e no Ubuntu como \ n
var sb = new StringBuilder();
sb.Append(first);
sb.AppendLine(); // which is equal to Append(Environment.NewLine);
sb.Append(second);
return sb.ToString();
first + Environment.NewLine + second
que é mais eficiente e (IMO) mais fácil de ler?
String.Format
produziria 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?
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.
"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?
string.Format
no comentário. A concatenação de cadeias não produzirá cadeias temporárias, porque o compilador chamará string.Concat(first, Environment.NewLine, second)
.
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
Se você deseja que o ReSharper destaque seus parâmetros, adicione atributo ao método acima
[StringFormatMethod ("formato")]
Esta implementação é obviamente menos eficiente do que apenas String.Format
Talvez alguém que esteja interessado nesta questão também esteja interessado na próxima pergunta: Formatação de string nomeada em C #
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>";
static class MyClass
{
public const string NewLine="\n";
}
string x = "first line" + MyClass.NewLine + "second line"
Environment.NewLine
- veja as outras respostas.
const string
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";
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.
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 />")
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 box
estilo de tipo definido usando.