C#6で文字列補間でエスケープ文字を使用するにはどうすればよいですか?


86

私は文字列補間を使用していて、それを気に入っていますが、出力にバックスラッシュを含めようとしているのに、それを機能させることができないという問題があります。

私が欲しいのはこのようなものです。

var domain = "mydomain";
var userName = "myUserName";
var combo = $"{domain}\{userName}"

コンボの出力を

myDomain\myUserName

私が得ているのは、\がエスケープ文字であるという構文エラーです。\\を入力すると、snytaxエラーはなくなりますが、出力はmyDomain \\ myUsernameです。

補間文字列にエスケープ文字を含めるにはどうすればよいですか?


ありがとう。しかし、文字列補間を使用することはできませんか?私はすべてを逃れたくない。補間された文字列内でバックスラッシュを使用したいだけです。
マット

いいえ、できません。彼の答えは間違っています。
greenhoorn 2015

3
私にはバグのように感じます;)\\は機能するはずです
Matt

$ {domain} \\ {userName}の正しい出力が得られます。これはWebアプリケーションですか?
greenhoorn 2015

2
ナンの答えは完璧に機能しているようです。$@"{domain}\{userName}"。私はあなたがそれを試して、それを受け入れるべきだと思います。ドメインとユーザー名も同じで、彼の方法は問題なく機能します。
ProfK 2016

回答:


104

バックスラッシュ(\)を使用したエスケープは、中括弧を除くすべての文字で機能します。

中括弧({または})をエスケープしようとしている場合は、https://msdn.microsoft.com/en-us/library/dn961160.aspxに従って{{またはを使用する必要があります}}

...二重中括弧(「{{」および「}}」)のすべての出現は、単一の中括弧に変換されます。


OPが明確に説明しているように、バックスラッシュ自体には機能しません。
ProfK 2016

79

$ @の両方を使用してこれを行うことができます。順序は重要です。

var combo = $@"{domain}\{userName}";

4
最良かつ簡単な答え。なぜ人々がより複雑な答えを選ぶのか理解できません。逐語的に補間された文字列のMSDNリンクdocs.microsoft.com/en-us/dotnet/csharp/tutorials/...
Alex34758

2
「C#8.0以降、$トークンと@トークンを任意の順序で使用できます」(上記のコメントのAlexのリンクから)。
ケーシープラマー

8

エドゥアルドは正しいです。倍にすることで中括弧をエスケープします。したがって、ドメイン変数を{mydomain}として出力する場合は、次のようにする必要があります。

$"{{{domain}}}";

さらに、現在の日付が2016年9月1日であると仮定すると、次のようになります。

$"The date is {DateTime.Now}";

ローカリゼーションに応じて、「日付は2016/09/01 3:04:48 PM」のように出力されます。次の手順で日付をフォーマットすることもできます。

$"The date is {DateTime.Now : MMMM dd, yyyy}";

「日付は2016年9月1日です」と出力されます。補間された文字列ははるかに読みやすくなります。良い答えエドゥアルド。


1
OPは中括弧をエスケープしようとはしていません。彼らは、バックスラッシュ自体をエスケープしようとしていることを明確に述べており、通常の `\\`は補間された文字列では機能しません。
ProfK 2016

3
中括弧を避けたいとOPが何を求めていたかは関係ありません。最初のグーグルエントリはこれでした。したがって、OPの見出しはグーグルを誤解させるので、これは有効な答えであり、賛成に値します。
AndrewBenjamin

4
$"{domain}\\{user}"

正常に動作します-エスケープは通常どおりに機能します(エスケープする場合を除く{)。少なくとも.NET4.6およびVS14.0.22823D14RELでは。

何らかの理由で機能しない場合(おそらく古いバージョンのコンパイラを使用している場合)、より明示的にすることもできます。

$"{domain}{@"\"}{user}"

それも私が思ったことです。興味深いことに、私のSurface Pro 3では、コードは通常の\\または明示的な@ "\"のいずれかで正常に機能しますが、私の作業マシンでは機能しません。ですから、インストールされているバージョンに関しては、頭に釘を打ったのではないかと思います。残念ながら、私の作業用マシンは更新が利用できないと言っています。だから、あなたへの私の質問は、私のマシン上の.net 4.6の正確なバージョン/ビルドをどのように決定するのですか?この点で、ビルド/バージョン番号に関する多くのガイダンスを見つけることができないという点で、状況は少し変わったようです。
マット

私の知る限り、両方のマシンで同じバージョンの.netとvs 2015RCを実行しています。私が考えることができる唯一の違いは、期待どおりに動作しているマシン(SP3)がWindows 10の最新のインサイダープレビューを実行していることです。.netフレームワークがこれに付属していると思うので、どういうわけか新しいバージョンがあるかもしれません。具体的に確認する方法がわかりません。
マット

UPDATEはCで探して:\ WINDOWS \ microsoft.net \ framework64 \ v4.0.30319フォルダclr.dllのプロパティの詳細で、私は違いを見ることができます。私の表面のバージョンは4.6.79.0で、私の作業マシンのバージョンは4.6.57.0です。だから私の質問は今、4.6.57.0から4.6.79.0にアップグレードするにはどうすればよいですか?(なぜこれはとても難しいのですか!;)
マット

@Mattそれだけではないと思います-私も4.6.57.0を持っていて、問題なく動作します。物事を台無しにするいくつかのVisualStudio拡張機能がインストールされている可能性はありますか?
ルアン2015

更新が表示されないにもかかわらず動作に違いが見られる場合は、最新のC#機能を使用するプロジェクトでNuGetパッケージ「Microsoft.Net.Compilers」を使用することを検討してください。これにより、観察された動作の違いが解決される場合があります。それは私たちのプロジェクトで行われました。
マンフレッド2017年

3

こんにちは、補間された文字列のバックスラッシュをエスケープするルールはバックスラッシュと重複しています:

var domain = "mydomain";
var userName = "myUserName";
var combo = $"{domain}\\{userName}";

コンソール出力

ただし、補間された文字列を逐語的な文字列としても使用する場合は、バックスラッシュをエスケープする必要はありません。

var domain = "mydomain";
var userName = "myUserName";
var combo = $@"{domain}\{userName}";

そしてあなたは同じようになります:

コンソール出力

補間された文字列に関するチュートリアル:ビデオ補間された文字列を参照してください


0

誤解していなければ。解決策は本当に簡単です

var domain = "mydomain";
var userName = "myUserName";
var combo = $"{{{domain}}}\\{{{userName}}}";
Console.WriteLine(combo);

私はbirdamongmenの答えとそこに提供されている良い参考資料を共有します。お役に立てば幸いです。私の5セント


1
あなたは誤解しました。OPは中括弧をエスケープしようとはしていません。彼らは、バックスラッシュ自体をエスケープしようとしていることを明確に述べており、通常の `\\`は補間された文字列では機能しません
ProfK

-1

あなたはこれを使うことができます-

'First, declare the curley braces as chars
        Dim LeftBrace As Char = "{"
        Dim RightBrace As Char = "}"

        'Then in your string, use like this-
        Dim myStr As String = $"This is a {LeftBrace}String{RightBrace}"

        'Now, the output will be
        ' This is a {string}code here

これはC#ではありませんか?(しかし、VB.NET?)
ジュリアン

まあ、これはvb .netプログラマーが彼の質問に対してac#の答えを得るときと同じ感覚です。
Vinod KC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.