Answers:
好吧,简单的选择是:
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字符串,可以执行以下操作:
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放置在格式字符串中的方法。这个想法是创建一个字符串扩展方法,该方法可以照常格式化字符串,但也可以使用Environment.NewLine替换文本中的{nl}
用法
" 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(“ format”)]
这种实现显然比String.Format效率低。
也许对这个问题感兴趣的人也会对下一个问题也感兴趣: C#中的命名字符串格式
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";
如果您正在使用Web应用程序,则可以尝试此操作。
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 />")