回答:
まあ、単純なオプションは次のとおりです。
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
、パフォーマンスによる複数の1行の文字列連結(など)は単一のものと等しいですか?または単にに変換されString.Concatenate(a,b,c,d,etc)
ますよね?
string.Format
コメントで提案しなかった理由です。コンパイラはを呼び出すため、文字列の連結では一時的な文字列は生成されませんstring.Concat(first, Environment.NewLine, second)
。
書式文字列にEnvironment.NewLineを配置するもう1つの方法。アイデアは、通常どおり文字列をフォーマットするだけでなく、テキストの{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( "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";
改行文字列を定数として本当に必要な場合は、次のようにすることができます。
public readonly string myVar = Environment.NewLine;
C#のreadonlyキーワードのユーザーは、この変数を1回だけ割り当てることができることを意味します。そのドキュメントはここにあります。実行時まで値がわからない定数変数を宣言できます。