私はc#に少し慣れていませんが、この時点で立ち往生しています。通常の文字列があり、\
を使用して"
をエスケープします。ここでエスケープするということは、コンパイラの解釈をエスケープすることを意味します。 "
、および"
を画面に出力すると、期待どおりの出力が得られます->
class Program
{
static void Main(string[] args)
{
string s1 = "This is a \"regular\" string";
System.Console.WriteLine(s1);
System.Console.Read();
}
}
今、私は逐語的な文字列を持っています、そして私は上記と同じ方法で"
を使用して\
をエスケープしようとしています..-->
class Program
{
static void Main(string[] args)
{
string s2 = @"This is \t a \"verbatim\" string";//this would escape \t
System.Console.WriteLine(s2);
System.Console.Read();
}
}
上記が機能しないのはなぜですか?
二重引用符を使用します。
string s2 = @"This is \t a ""verbatim"" string";
二重引用符を含む逐語的な文字列を記述したい場合は、2つの二重引用符を記述する必要があります。
string s2 = @"This is \t a ""verbatim"" string";
これは C#仕様のセクション2.4.4.5 でカバーされています:
2.4.4.5文字列リテラル
C#は、通常の文字列リテラルと逐語的な文字列リテラルの2つの形式の文字列リテラルをサポートしています。
通常の文字列リテラルは、「hello」のように二重引用符で囲まれた0個以上の文字で構成され、単純なエスケープシーケンス(タブ文字の場合は\ tなど)と16進数およびUnicodeのエスケープシーケンスの両方を含めることができます。
逐語的な文字列リテラルは、@文字とそれに続く二重引用符文字、0個以上の文字、および終了二重引用符文字で構成されます。簡単な例は@ "hello"です。逐語的な文字列リテラルでは、区切り文字の間の文字は逐語的に解釈されますが、唯一の例外は引用符-エスケープシーケンスです。特に、単純なエスケープシーケンス、16進数およびUnicodeのエスケープシーケンスは、逐語的な文字列リテラルでは処理されません。逐語的な文字列リテラルは複数行にまたがることがあります。
逐語的な文字列では、円記号はエスケープ文字ではなく標準文字として扱われます。エスケープが必要な唯一の文字は引用符です。これは、まったく同じ文字を使用してエスケープできます。
string s2 = @"This is \t a ""verbatim"" string";
もちろん、このメソッドを使用して\t
(タブ)のような特殊文字を追加することはできないため、単純な文字列にのみ役立ちます。これは、ファイルパスを操作する場合にのみ使用すると思います。