В .NET я могу предоставить оба \r
или \n
строковые литералы, но есть способ вставить что-то вроде специального символа «новая строка», например, Environment.NewLine
статическое свойство?
В .NET я могу предоставить оба \r
или \n
строковые литералы, но есть способ вставить что-то вроде специального символа «новая строка», например, Environment.NewLine
статическое свойство?
Ответы:
Ну, простые варианты:
string.Format
:
string x = string.Format("first line{0}second line", Environment.NewLine);
Конкатенация строк:
string x = "first line" + Environment.NewLine + "second line";
Строковая интерполяция (в C # 6 и выше):
string x = $"first line{Environment.NewLine}second line";
Вы также можете использовать \ n везде и заменить:
string x = "first line\nsecond line\nthird line".Replace("\n",
Environment.NewLine);
Обратите внимание, что вы не можете сделать это строковой константой , потому что значение Environment.NewLine
будет доступно только во время выполнения.
Environment.NewLine
? Наоборот, это хорошая практика
Если вы хотите, чтобы константная строка содержала Environment.NewLine, вы можете сделать что-то вроде этого:
const string stringWithNewLine =
@"first line
second line
third line";
Так как это в константной строке, это делается во время компиляции, поэтому это интерпретация новой строки компилятором. Я не могу найти ссылку, объясняющую это поведение, но я могу доказать, что оно работает как задумано. Я скомпилировал этот код на Windows и Ubuntu (с Mono), затем разобрал, и вот результаты:
Как видите, в Windows переводы строк интерпретируются как \ r \ n, а в Ubuntu - как \ 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
который является более эффективным и (ИМО) легче читать?
String.Format
будет производиться 1 строка за раз (но внутренне она немного медленная из-за конкатенации, специфичной для культуры, и т. Д.), В то время как конкатенация строк - 1 в результате + 1 временно, верно?
String.Concatenate
, что напрямую создает только одну выходную строку (IIRC, если строки являются литералами, конкатенация выполняется в компиляторе.
"a"+b+"c"+d
и т. Д.) По производительности равна одной? Или просто переоборудован в String.Concatenate(a,b,c,d,etc)
, верно?
string.Format
в комментарии. Конкатенация строк не создаст никаких временных строк, потому что компилятор вызовет string.Concat(first, Environment.NewLine, second)
.
Еще один способ удобного размещения Environment.NewLine в формате строки. Идея состоит в том, чтобы создать метод расширения строки, который форматирует строку как обычно, но также заменяет {nl} в тексте на Environment.NewLine
использование
" X={0} {nl} Y={1}{nl} X+Y={2}".FormatIt(1, 2, 1+2);
gives:
X=1
Y=2
X+Y=3
Код
///<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);
}
Заметка
Если вы хотите, чтобы ReSharper выделил ваши параметры, добавьте атрибут к методу выше
[StringFormatMethod ( "Формат")]
Эта реализация явно менее эффективна, чем просто String.Format
Может быть, тот, кто заинтересован в этом вопросе, также заинтересовался бы следующим вопросом: Форматирование именованных строк в C #
string myText =
@"<div class=""firstLine""></div>
<div class=""secondLine""></div>
<div class=""thirdLine""></div>";
это не то:
string myText =
@"<div class=\"firstLine\"></div>
<div class=\"secondLine\"></div>
<div class=\"thirdLine\"></div>";
более новые версии .net позволяют вам использовать $ перед литералом, который позволяет вам использовать переменные внутри следующим образом:
var x = $"Line 1{Environment.NewLine}Line 2{Environment.NewLine}Line 3";
Если вы действительно хотите, чтобы строка New Line была константой, вы можете сделать это:
public readonly string myVar = Environment.NewLine;
Пользователь ключевого слова readonly в C # означает, что эта переменная может быть назначена только один раз. Вы можете найти документацию по этому вопросу здесь . Это позволяет объявлять постоянную переменную, значение которой неизвестно до времени выполнения.
Если вы работаете с веб-приложением, вы можете попробовать это.
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 />")
Если я понимаю вопрос: пара, "\r\n"
чтобы получить эту новую строку ниже в textbox
. Мой пример сработал -
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;
Типичный ответ может быть s1
s2
в text box
использовании определенного стиля стиля.