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」のように二重引用符で囲まれたゼロ個以上の文字で構成され、単純なエスケープシーケンス(タブ文字の\ tなど)と16進およびUnicodeエスケープシーケンスの両方を含むことができます。
逐語的文字列リテラルは、@文字の後に二重引用符文字、ゼロ個以上の文字、閉じ二重引用符文字が続きます。簡単な例は@ "hello"です。逐語的な文字列リテラルでは、区切り文字の間の文字は逐語的に解釈され、唯一の例外は引用エスケープシーケンスです。特に、単純なエスケープシーケンスと16進およびUnicodeエスケープシーケンスは、逐語的な文字列リテラルでは処理されません。逐語的な文字列リテラルは複数行にまたがることがあります。
つまり、@ "verbatim string literal"の唯一の特殊文字は二重引用符文字です。ダブルクォートを含む逐語的な文字列を書きたい場合、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\\.");