通常の文字列と逐語的文字列の違いは何ですか?


166

私はResharperの試用版を持っていますが、通常の文字列を逐語的な文字列に切り替えることを常に示唆しています。違いはなんですか?


3
ReSharperからのこの提案は見たことがありません。これが示唆する例を挙げられますか?
John Saunders、

3
わかった。最初の提案はそれをリソースに移動することでしたが、2番目はそれを逐語的な文字列にすることでした:MessageBox.Show( "カモノハシは作業を進める前に愛撫する必要があります。
B.クレイシャノン

私はまだそれをいつも手に入れています。これは、理由を問わず文字列を逐語的にすることを提案しているため、通常はオフにしたい再シャープな警告の1つです。
ディーンSwiatek 2018年

あなたのVisual Studio IDEのための私の提案機能のような場合は、こちらをupvoteしてください:developercommunity.visualstudio.com/idea/602807/...
オリヴィエJacot-Descombes

回答:


191

逐語的文字列は、ファイル名のようにエスケープする必要がない文字列です。

string myFileName = "C:\\myfolder\\myfile.txt";

だろう

string myFileName = @"C:\myfolder\myfile.txt";

@記号は、その文字列を文字どおりに読み取ることを意味し、それ以外の場合は制御文字を解釈しません。


12
なぜResharperはこの変更を提案しているのでしょうか。エスケープ文字を無視できるため、逐語的文字列がより効率的に処理されるかどうかをCLRの教祖は知っていますか?
マットピーターソン

9
逐語的文字列の方が読みやすいので、ReSharperが提案しているのではないかと思います。
andyp

36
これは一種のコーディング規約だと思います(これまでに見たことも聞いたこともありません)。文字列の場合、ReSharperはローカライズのためにリソースファイルに移動するか、逐語的にすることを提案します。逐語的な文字列の場合、ReSharperは文字列をローカライズするオプションを提供しなくなります。したがって、ローカリゼーションを必要としないすべての文字列を逐語的にすることは慣習のようです。
ダニエル・ブリュックナー

文字列リテラルが文字列変数に割り当てられているとしましょう。stringmyFileName = "C:\\ myfolder \\ myfile.txt"; ここで、myFileName文字列変数を逐語的文字列に変換します。どうすればいいのですか?これは機能しますか?文字列verbatimStr = @myFileName;
sanjeev bhusal 2017年

3
@sanjeevbhusal:あなたは本当にそんなことはしません。@ "C:\ myfolder \ myfile.txt"と "C:\\ myfolder \\ myfile.txt"はCLRと同じです。基本的には、これは構文上の砂糖です。
alc6379 2017年

68

これは、C#仕様のセクション2.4.4.5で説明されています。

2.4.4.5文字列リテラル

C#は、通常の文字列リテラルと逐語的文字列リテラルの2つの形式の文字列リテラルをサポートしています。

通常の文字列リテラルは、 "hello"のように二重引用符で囲まれた0個以上の文字で構成され、単純なエスケープシーケンス(タブ文字の\ tなど)と16進およびUnicodeエスケープシーケンスの両方を含めることができます。

逐語的文字列リテラルは、@文字の後に二重引用符文字、0個以上の文字、および二重引用符で構成される文字で構成されます。簡単な例は@ "hello"です。逐語的文字列リテラルでは、区切り文字の間の文字は逐語的に解釈されますが、唯一の例外は引用エスケープシーケンスです。特に、単純なエスケープシーケンスと16進数およびUnicodeのエスケープシーケンスは、逐語的文字列リテラルでは処理されません。逐語的文字列リテラルは複数行にまたがることがあります。

言い換えると、@ "逐語的文字列リテラル"の唯一の特殊文字は、二重引用符文字です。二重引用符を含む逐語的な文字列を書きたい場合は、2つの二重引用符を書く必要があります。他のすべての文字は文字どおりに解釈されます。

逐語的な文字列リテラルにリテラルの改行を含めることもできます。通常の文字列リテラルでは、リテラルの改行を含めることはできません。代わりに、たとえばを使用する必要があります"\n"

逐語的文字列リテラルは、ソースコードにファイル名と正規表現を埋め込むのに役立ちます。これらのタイプの文字列のバックスラッシュは一般的であり、通常の文字列リテラルが使用されている場合はエスケープする必要があるためです。

通常の文字列リテラルから作成された文字列と逐語的文字列リテラルから作成された文字列の間には、実行時に違いはありませんSystem.String。どちらも型です。


27

文字列と逐語的文字列の間にランタイムの違いはありません。それらはコンパイル時にのみ異なります。コンパイラーは、逐語的文字列で受け入れるエスケープシーケンスの数が少ないため、引用エスケープ以外の表示内容を取得できます。

逐語的文字@を使用して、キーワードを名前として扱うようコンパイラーに指示することもできます。

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);

16

逐語的文字列を使用して、複数行の文字列も持つことができます。

Console.WriteLine(@"This
    is
    a
    Test
    for stackoverflow");

@エラーなしで。

VB14にはと呼ばれる新機能がありMultiline Strings、C#の逐語的文字列のようなものです。

複数行の文字列

プロのヒント:VB文字列リテラルは、C#の逐語的文字列とまったく同じになりました。


13

通常の文字列は、特殊なエスケープシーケンスを使用して特殊文字に変換されます。

/*
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\\.");

0

Resharperの警告を削除したい場合は、以下を使用できます。

Localizable(false)

パラメータ、ファイルの場所など。これは良い解決策になるでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.