私はResharperの試用版を持っていますが、通常の文字列を逐語的な文字列に切り替えることを常に示唆しています。違いはなんですか?
私はResharperの試用版を持っていますが、通常の文字列を逐語的な文字列に切り替えることを常に示唆しています。違いはなんですか?
回答:
逐語的文字列は、ファイル名のようにエスケープする必要がない文字列です。
string myFileName = "C:\\myfolder\\myfile.txt";
だろう
string myFileName = @"C:\myfolder\myfile.txt";
@記号は、その文字列を文字どおりに読み取ることを意味し、それ以外の場合は制御文字を解釈しません。
これは、C#仕様のセクション2.4.4.5で説明されています。
2.4.4.5文字列リテラル
C#は、通常の文字列リテラルと逐語的文字列リテラルの2つの形式の文字列リテラルをサポートしています。
通常の文字列リテラルは、 "hello"のように二重引用符で囲まれた0個以上の文字で構成され、単純なエスケープシーケンス(タブ文字の\ tなど)と16進およびUnicodeエスケープシーケンスの両方を含めることができます。
逐語的文字列リテラルは、@文字の後に二重引用符文字、0個以上の文字、および二重引用符で構成される文字で構成されます。簡単な例は@ "hello"です。逐語的文字列リテラルでは、区切り文字の間の文字は逐語的に解釈されますが、唯一の例外は引用エスケープシーケンスです。特に、単純なエスケープシーケンスと16進数およびUnicodeのエスケープシーケンスは、逐語的文字列リテラルでは処理されません。逐語的文字列リテラルは複数行にまたがることがあります。
言い換えると、@ "逐語的文字列リテラル"の唯一の特殊文字は、二重引用符文字です。二重引用符を含む逐語的な文字列を書きたい場合は、2つの二重引用符を書く必要があります。他のすべての文字は文字どおりに解釈されます。
逐語的な文字列リテラルにリテラルの改行を含めることもできます。通常の文字列リテラルでは、リテラルの改行を含めることはできません。代わりに、たとえばを使用する必要があります"\n"
。
逐語的文字列リテラルは、ソースコードにファイル名と正規表現を埋め込むのに役立ちます。これらのタイプの文字列のバックスラッシュは一般的であり、通常の文字列リテラルが使用されている場合はエスケープする必要があるためです。
通常の文字列リテラルから作成された文字列と逐語的文字列リテラルから作成された文字列の間には、実行時に違いはありませんSystem.String
。どちらも型です。
文字列と逐語的文字列の間にランタイムの違いはありません。それらはコンパイル時にのみ異なります。コンパイラーは、逐語的文字列で受け入れるエスケープシーケンスの数が少ないため、引用エスケープ以外の表示内容を取得できます。
逐語的文字@を使用して、キーワードを名前として扱うようコンパイラーに指示することもできます。
var @if = "if";
//okay, treated as a name
Console.WriteLine(@if);
//compiler err, if without @ is a keyword
Console.WriteLine(if);
var @a = "a";
//okay
Console.WriteLine(@a);
//also okay, @ isn't part of the name
Console.WriteLine(a);
逐語的文字列を使用して、複数行の文字列も持つことができます。
Console.WriteLine(@"This
is
a
Test
for stackoverflow");
@
エラーなしで。
VB14にはと呼ばれる新機能がありMultiline Strings
、C#の逐語的文字列のようなものです。
プロのヒント:VB文字列リテラルは、C#の逐語的文字列とまったく同じになりました。
通常の文字列は、特殊なエスケープシーケンスを使用して特殊文字に変換されます。
/*
This string contains a newline
and a tab and an escaped backslash\
*/
Console.WriteLine("This string contains a newline\nand a tab\tand an escaped backslash\\");
逐語的文字列は、エスケープシーケンスを変換せずにそのまま解釈されます。
/*
This string displays as is. No newlines\n, tabs\t or backslash-escapes\\.
*/
Console.WriteLine(@"This string displays as is. No newlines\n, tabs\t or backslash-escapes\\.");