C#6の長い文字列補間線


134

文字列の補間は、既存のコードベースの文字列Format呼び出しに適用すると非常に便利ですが、一般的に推奨される列の制限を考えると、文字列は1行では急速に長くなりすぎます。特に、補間される式が複雑な場合。書式文字列を使用すると、複数の行に分割できる変数のリストがあります。

var str = string.Format("some text {0} more text {1}",
    obj1.property,
    obj2.property);

誰かがこれらのラインを分割するための好ましい手段を持っていますか?

私はあなたが次のようなことをすることができると思います:

var str = $"some text { obj1.property }" +
  " more text { obj2.property };

1
私の経験では、複雑な式を補間することは避けた方がよいでしょう。その場合はむしろ変数を抽出します。これを行うと、文字列内の改行がある場所で分割すると、通常はうまく収まります。
markijbema

2
私はこの質問で混乱しています。私はちょうど次の$""ように機能する複数行が必要です@""
大佐パニック

2
パニック大佐、質問は長い補間線を分割して、文字列リテラル自体に改行を導入せずに列幅の要件に違反しないようにする方法について尋ねています。$ @ ""は素晴らしいですが、それに導入された改行は文字列リテラルになります。
エレミヤゴーディ

4
危険:$"some text { obj1.property }" + " more text { obj2.property }";あなたが思っているようには見えない。その式の前半のみが補間された文字列です。それは、その後で連結されて -interpolated文字列リテラル" more text { obj2.property }"
bacar

1
$ @で\ t \ r \ nをサポートするには、質問stackoverflow.com/questions/51991713/…を
M.Hassan

回答:


198

あなたはできる複数行に改行が、私は、構文はこれ以上素敵に見える言わないだろう。

$@補間された逐語的文字列を使用するには構文を使用する必要があり{...}、次のようにパラメーター内に改行を配置できます。

string s = $@"This is all {
    10
    } going to be one long {
    DateTime.Now
    } line.";

上記の文字列には改行は含まれず、実際には次のような内容になります。

これは、2015年1月8日23.49.47行の1つになる10のすべてです。

(注、ノルウェー語形式)

とは言っても、私はの使用をやめませんstring.Format。私の意見では、これらの文字列補間式のいくつかは本当によく見えますが、より複雑な式は非常に読みにくくなります。を使用しない限りFormattableString、コードはString.Formatとにかく呼び出しにコンパイルされることを考えると、私はString.Formatそれが意味のある場所に進み続けると言います。


確かな答え。私はかなり確信しているFormattableStringの呼び出しに沸くString.Formatすぎ。
Alex Booker 2015

8
この回答は、これと正反対の方法を理解するのに役立ちました。$@""構文をありがとう!
ボブソン

@AlexBookerそれよりも複雑です。FormattableString.Invarian($"Hello {name}" + \n "are you the owner of {pet}?");2つの補間された文字列を1つの単純な文字列にマージするため、これを行うことはできません。
ANeves

改行とタブは、補間された逐語的文字列で尊重されます。以下をC#の対話型ウィンドウに入力すると、結果の文字列がフォーマットされます。> var name = "Simon"; var templateName = "How to interpolate a verbatim string"; var now = DateTime.UtcNow;. var output = $@"Hi {name}, This template is a demo of {templateName}. It was ran at {now.ToString("o")}"; > output。出力は"Hi Simon,\r\nThis template is a demo of How to interpolate a verbatim string.\r\n\r\nIt was ran at 2020-01-24T15:49:35.6678353Z"
Enzoaeneas

1
@Enzoaeneasコメントでフォーマットのサポートを過大評価したと思いますが、私はあなたの言っていることを理解し、同意します。
Lasse V. Karlsen、

61

あなたは組み合わせることができます$し、@文字列の補間、複数行の文字列リテラルを取得するために一緒に:

var str = $@"some text { obj1.property }
     more text { obj2.property }";

しかし、それはあなたNewLineにその間の性格を与えるので、それはあなたが望むものではないかもしれません。


3
しかし、@は実際に改行をリテラルに入れませんか?
エレミヤゴウディ

5
します。はっきりとそれを言うために私の答えを更新しました。
MarcinJuraszek

新しい行だけでなく、新しい行の最初のタブも。$@"Visual Studioで使用するときに実際の文字列形式を正しく表示するには、テキストエディターの左端から新しい各行を開始する必要があります。
GDS 2016年

このソリューションでは、たとえば\ rと\ nを文字列で使用することはできません
JohanFranzénNov

22

OPが別の質問をしましたが、この質問を読んでいる多くの人がのように機能する複数行の補間$""を希望していると思い@""ます。それを行うには、$@""

$@"Height: {height}
Width: {width}
Background: {background}"

3
彼は出力に改行を入れたくありません。コード自体を別の行に
折り返すだけです

7
彼は、この回答は、文字列補間構文を使用して複数行の文字列を実行する方法を検索する聴衆を対象としていることを明らかにしました。
Brandon Bonds

2

これだよ:

var str = $"some text { obj1.property }" +
          $" more text { obj2.property }";

の2番目$に注意してください$"..." + $"..."


18
これにより、String.Formatが2回呼び出され、メモリ内に3つの文字列(サイドA、サイドB、およびA + B)も作成されることに注意してください
Kevin Kalitowski

1
これによりFormattableString、連結された文字列にキャストを使用できなくなりますか?
binki

4
今日の多くの実装では、GBのメモリを備えたGHz CPUで実行する場合、追加の呼び出しと追加の文字列によってパフォーマンスの問題が発生することはありません。パフォーマンスの問題は、たとえばO(n2)のアルゴリズムを使用することによって引き起こされます。この男に反対票を投じることは不当だと思います。
JohanFranzén19年

1

例として、オーバーライドされたToString()内でStringBuilderを使用しました。

    // return employee data
    public override string ToString()
    {
        StringBuilder buffer = new StringBuilder();
        buffer.AppendLine($"Number: {EmployeeNumber}");
        buffer.AppendLine($"Name: {EmployeeName}");
        buffer.AppendLine($"Address: {PostalAddress}");
        buffer.AppendLine($"Phone: {PhoneNumber}");
        buffer.AppendLine($"Age: {EmployeeAge}");
        buffer.AppendLine($"Gender: {EmployeeGender}");
        buffer.AppendLine($"Status: {EmployeeStatus}");
        buffer.AppendLine($"Manager: {EmployeeManager}");
        buffer.AppendLine($"Start: {EmployeeStartDate.ToShortDateString()}");
        return buffer.ToString();
    }

それならなぜbuffer.AppendFormat("{0}Number: {1}", Environment.NewLine, EmployeeNumber);ですか???
TS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.