11

C#コンパイラまたは.NETランタイムが逐語的な文字列リテラルを処理する方法とエスケープシーケンスを使用する方法(つまりパフォーマンス)に違いはありますか、それとも単に設計時のスタイルの問題ですか?例えば:

var pathA = "c:\\somewhere";
var pathB = @"c:\somewhere";

それらは同じようにコンパイルされていると思いますが、それは問題ではありませんが、興味がありました。

4

3 に答える 3

19

ここでの違いは、厳密にコンパイラに限定されます。IL とランタイムには、逐語的なものとエスケープされたものの概念がありません。文字列だけがあります

どちらを選択するかについては、より便利な方を選択します;p 通常とは異なる文字がある場合、私はほとんどの場合、逐語的な文字列リテラルを使用します。

興味深い事例として:

bool areSame = ReferenceEquals("c:\\somewhere", @"c:\somewhere"); // true

これは、それらがまったく同じ文字列インスタンスであることを示しています(「interning」のおかげです)。それらは単に同等ではありません。これらは、ランタイムに対して同じ文字列インスタンスです。したがって、それらが (ランタイムに対して) 何らかの形で異なる可能性はありません。

于 2013-01-29T13:20:33.123 に答える
3

それらはまったく同じです。逆コンパイラで 2 つのバージョンを逆コンパイルしてみてください。

これは、開発者がコードに記述する際の便宜上の問題にすぎません。

于 2013-01-29T13:20:31.700 に答える
1

文字列の前の @ 記号は、埋め込まれたエスケープ シーケンスを無視するようにコンパイラに指示します。

文字列 "\"" は単一の二重引用符を生成します. 文字列 "\" は単一のバックスラッシュを生成します. 文字列 @"\" は 2 つのバックスラッシュを生成します.

于 2013-01-29T13:23:11.273 に答える