web-dev-qa-db-ja.com

C#の文字列の前にある@は何ですか?

これはC#(またはおそらくVB.net)に対する.NETの質問ですが、私は次の宣言の違いを理解しようとしています。

string hello = "hello";

vs.

string hello_alias = @"hello";

コンソールに出力しても違いはありません。長さのプロパティは同じです。

535
Klaw

文字列を 逐語的文字列リテラル としてマークします - 通常は エスケープシーケンスとして解釈される文字列内のもの は無視されます。

だから"C:\\Users\\Rich"@"C:\Users\Rich"と同じです

例外が1つあります。二重引用符にはエスケープシーケンスが必要です。二重引用符をエスケープするには、2つの二重引用符を1行に入れる必要があります。たとえば、@"""""に評価されます。

675
Richard Everett

これは逐語的文字列リテラルです。つまり、エスケープは適用されません。例えば:

string verbatim = @"foo\bar";
string regular = "foo\\bar";

ここでverbatimregularは同じ内容です。

また、複数行の内容も許可されます。これはSQLには非常に便利です。

string select = @"
SELECT Foo
FROM Bar
WHERE Name='Baz'";

逐語的文字列リテラルに必要な1ビットのエスケープは、二重引用符( ")を2倍にすることです。

string verbatim = @"He said, ""Would you like some coffee?"" and left.";
string regular = "He said, \"Would you like some coffee?\" and left.";
231
Jon Skeet

'@'には別の意味もあります。変数宣言の前に置くと、予約語を変数名として使用できます。

例えば:

string @class = "something";
int @object = 1;

私はこれのための1つか2つの合法的な用途を見つけました。このようなことをしたいときは主にASP.NET MVCで:

<%= Html.ActionLink("Text", "Action", "Controller", null, new { @class = "some_css_class" })%>

これは次のようなHTMLリンクを生成します。

<a href="/Controller/Action" class="some_css_class">Text</a>

それ以外の場合は、予約済みのキーワードではない「Class」を使用する必要がありますが、大文字の「C」はHTML標準に準拠しておらず、正しく表示されません。

52
JulianR

VBも明示的に要求したので、この逐語的な文字列構文はVBには存在せず、C#にのみ存在することを付け加えておきます。そうではなく、すべての文字列はVBの中で逐語的です(C#の逐語的文字列とは異なり、改行を含めることはできません)。

Dim path = "C:\My\Path"
Dim message = "She said, ""Hello, beautiful world."""

エスケープシーケンスはVBには存在しません(C#の逐語的文字列のように、引用符文字が2倍になることを除いて)ので、いくつかのことがより複雑になります。たとえば、VBに次のコードを書くには、連結(または文字列を構成するための他の方法のいずれか)を使用する必要があります。

string x = "Foo\nbar";

VBでは、これは次のようになります。

Dim x = "Foo" & Environment.NewLine & "bar"

&はVB文字列連結演算子です。+も同様に使用できます。)

18
Konrad Rudolph

http://msdn.Microsoft.com/ja-jp/library/aa691090.aspx

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

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

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

10
Ed Guiness

これは逐語的な文字列で、エスケープ規則を変更します - 現在エスケープされている唯一の文字は "、"にエスケープされています。これはファイルパスや正規表現に特に便利です。

var path = @"c:\some\location";
var tsql = @"SELECT *
            FROM FOO
            WHERE Bar = 1";
var escaped = @"a "" b";

9
Marc Gravell

MSDN からコピーしたもの:

コンパイル時に、逐語的文字列はすべて同じエスケープシーケンスで通常の文字列に変換されます。したがって、デバッガのウォッチウィンドウに逐語的文字列を表示すると、ソースコードの逐語的バージョンではなく、コンパイラによって追加されたエスケープ文字が表示されます。たとえば、逐語的な文字列@"C:\files.txt"は、ウォッチウィンドウに"C:\\files.txt"として表示されます。

9
aanund

文字列の前に@を配置すると、特殊コードやエスケープ文字を使用せずに、バックスラッシュや二重引用符などの特殊文字を使用できます。

だからあなたは書くことができます:

string path = @"C:\My path\";

の代わりに:

string path = "C:\\My path\\";
7
Presidenten

説明は簡単です。文字列"string\"を表すには、"string\\"がエスケープ文字であるため、コンパイラは\を必要とします。代わりに@"string\"を使うのであれば、\\を忘れることができます。

3
Ray Wu