У .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
? Зовсім навпаки, це хороша практика використовувати його
Якщо ви хочете рядок const, що містить у собі Environment.NewLine, ви можете зробити щось подібне:
const string stringWithNewLine =
@"first line
second line
third line";
Оскільки це в рядку const, це робиться під час компіляції, тому інтерпретація нового рядка компілятора. Я, здається, не можу знайти посилання, що пояснює цю поведінку, але можу довести, що вона працює за призначенням. Я скомпілював цей код і в 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
який є більш ефективним та (IMO) легше читати?
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>";
static class MyClass
{
public const string NewLine="\n";
}
string x = "first line" + MyClass.NewLine + "second line"
Environment.NewLine
- дивіться інші відповіді.
const string
новіші версії .net дозволяють використовувати $ перед літералом, що дозволяє використовувати змінні всередині:
var x = $"Line 1{Environment.NewLine}Line 2{Environment.NewLine}Line 3";
Якщо ви дійсно хочете, щоб рядок "Нова лінія" був постійним, тоді ви можете це зробити:
public readonly string myVar = Environment.NewLine;
Користувач ключового слова для читання лише в 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
використанні певного типу стилю.