逐語的文字列を補間でどのように使用しますか?


133

C#6には、補間された文字列という新しい機能があります。

これらを使用すると、インデックスに依存するのではなく、式をコードに直接配置できます。

string s = string.Format("Adding \"{0}\" and {1} to foobar.", x, this.Y());

になる:

string s = $"Adding \"{x}\" and {this.Y()} to foobar.";

ただし、次のように逐語的文字列(主にSQLステートメント)を使用して、複数行にわたって多くの文字列があります。

string s = string.Format(@"Result...
Adding ""{0}"" and {1} to foobar:
{2}", x, this.Y(), x.GetLog());

これらを通常の文字列に戻すのは面倒です:

string s = "Result...\r\n" +
$"Adding \"{x}\" and {this.Y()} to foobar:\r\n" +
x.GetLog().ToString();

逐語的文字列と補間文字列の両方を一緒に使用するにはどうすればよいですか?


3
それが本当にSQL文字列に関するものである場合、代わりにパラメーター化されたクエリを使用しない理由はありますか?
2015

1
「逐語的文字列(主にSQLステートメント)を使用して複数の行にまたがる文字列がたくさんあります」SQLインジェクション攻撃を可能にするSQL文字列がたくさんあるようです。
Cetin Basoz

1
@svick私たちは、ユーザー入力はすべてパラメーター化されています。ただし、コードでエンティティのSQLを動的に作成するため、動的SQLは引き続き頻繁に使用します。
キース

1
@CetinBasozは使用しません-すべてのユーザー入力はパラメーター化されます。動的SQLを使用している状況はたくさんあります。たとえば、LINQやその他のオブジェクトマッピングフレームワークです。
キース

回答:


194

$@接頭辞の両方を同じ文字列に適用できます。

string s = $@"Result...
Adding ""{x}"" and {this.Y()} to foobar:
{x.GetLog()}";

C#6導入されて以来、補間された逐語的文字列はトークン$@開始する必要がありましたが、C#8で開始すると、$@またはのいずれかを使用できます@$


57
反対(@$"...")が機能しないため、ここに移動します。
Sinatr 2015

12
@Sinatrええ、それは$@"..."その順序でなければなりません。
キース

36
$@機能@$しないときに機能するという事実は、考えてみると完全に理にかなっています。この構文を使用し始めたときに頻繁に発生するこれについて混乱したとき、私はいつも「この逐語的文字列を補間する」と自分に言いました。
碧2015年

1
@RayLuoは実際にはそうではありませんが、さまざまな.NET JSONシリアライザーがどれほど高速になったかを考えると、おそらくJSONを直接エンコードするべきではありません。
キース

1
既存のにデュオを適用する場合はconst string、ドロップしconstます。
bvj 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.