これはC#(またはおそらくVB.net)に対する.NETの質問ですが、私は次の宣言の違いを理解しようとしています。
string hello = "hello";
vs.
string hello_alias = @"hello";
コンソールに出力しても違いはありません。長さのプロパティは同じです。
文字列を 逐語的文字列リテラル としてマークします - 通常は エスケープシーケンスとして解釈される文字列内のもの は無視されます。
だから"C:\\Users\\Rich"
は@"C:\Users\Rich"
と同じです
例外が1つあります。二重引用符にはエスケープシーケンスが必要です。二重引用符をエスケープするには、2つの二重引用符を1行に入れる必要があります。たとえば、@""""
は"
に評価されます。
これは逐語的文字列リテラルです。つまり、エスケープは適用されません。例えば:
string verbatim = @"foo\bar";
string regular = "foo\\bar";
ここでverbatim
とregular
は同じ内容です。
また、複数行の内容も許可されます。これは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.";
'@'には別の意味もあります。変数宣言の前に置くと、予約語を変数名として使用できます。
例えば:
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標準に準拠しておらず、正しく表示されません。
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文字列連結演算子です。+
も同様に使用できます。)
http://msdn.Microsoft.com/ja-jp/library/aa691090.aspx
C#は、2つの形式の文字列リテラルをサポートします。通常の文字列リテラルと逐語的な文字列リテラルです。
通常の文字列リテラルは、 "hello"のように、二重引用符で囲まれた0個以上の文字で構成され、単純なエスケープシーケンス(タブ文字の\ tなど)と16進数およびUnicodeのエスケープシーケンスの両方を含みます。
逐語的文字列リテラルは、@文字とそれに続く二重引用符文字、0個以上の文字、およびそれに続く二重引用符文字で構成されます。簡単な例は@ "hello"です。逐語的文字列リテラルでは、区切り文字の間の文字は逐語的に解釈されます。唯一の例外はquote-escape-sequenceです。特に、単純なエスケープシーケンス、16進およびUnicodeのエスケープシーケンスは、文字列リテラルでは処理されません。逐語的文字列リテラルは複数行にまたがることがあります。
これは逐語的な文字列で、エスケープ規則を変更します - 現在エスケープされている唯一の文字は "、"にエスケープされています。これはファイルパスや正規表現に特に便利です。
var path = @"c:\some\location";
var tsql = @"SELECT *
FROM FOO
WHERE Bar = 1";
var escaped = @"a "" b";
等
MSDN からコピーしたもの:
コンパイル時に、逐語的文字列はすべて同じエスケープシーケンスで通常の文字列に変換されます。したがって、デバッガのウォッチウィンドウに逐語的文字列を表示すると、ソースコードの逐語的バージョンではなく、コンパイラによって追加されたエスケープ文字が表示されます。たとえば、逐語的な文字列
@"C:\files.txt"
は、ウォッチウィンドウに"C:\\files.txt"
として表示されます。
文字列の前に@
を配置すると、特殊コードやエスケープ文字を使用せずに、バックスラッシュや二重引用符などの特殊文字を使用できます。
だからあなたは書くことができます:
string path = @"C:\My path\";
の代わりに:
string path = "C:\\My path\\";
説明は簡単です。文字列"string\"
を表すには、"string\\"
がエスケープ文字であるため、コンパイラは\
を必要とします。代わりに@"string\"
を使うのであれば、\\
を忘れることができます。