これはC#(または場合によってはVB.net)に対する.NETの質問ですが、次の宣言の違いを理解しようとしています。
string hello = "hello";
対
string hello_alias = @"hello";
コンソールで出力しても違いはありません。長さのプロパティは同じです。
@
ます。
これはC#(または場合によってはVB.net)に対する.NETの質問ですが、次の宣言の違いを理解しようとしています。
string hello = "hello";
対
string hello_alias = @"hello";
コンソールで出力しても違いはありません。長さのプロパティは同じです。
@
ます。
回答:
文字列を逐語的な文字列リテラルとしてマークします。通常、エスケープシーケンスとして解釈される文字列内の文字は無視されます。
だから"C:\\Users\\Rich"
と同じです@"C:\Users\Rich"
例外が1つあります。二重引用符にはエスケープシーケンスが必要です。二重引用符をエスケープするには、2つの二重引用符を続けて配置する必要があります。たとえば、はに@""""
評価され"
ます。
{{
通常のブレースを使用する場合も、ブレースを2重にする必要がありstring.Format
ます。
それは逐語的な文字列リテラルです。つまり、エスケープは適用されません。例えば:
string verbatim = @"foo\bar";
string regular = "foo\\bar";
こちらverbatim
とregular
同じ内容です。
また、複数行のコンテンツも可能です。これはSQLに非常に便利です。
string select = @"
SELECT Foo
FROM Bar
WHERE Name='Baz'";
逐語的文字列リテラルに必要なエスケープの1ビットは、二重引用符( ")を取得することです。
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>
それ以外の場合は、予約済みのキーワードではない「クラス」を使用する必要がありますが、大文字の「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文字列連結演算子です。+
同じように使用できます。)
"
とを"
。
String.Format
、これを行うことができます。実際、私は今では決して書くこと"x" & Environment.NewLine
はせず、代わりに常にString.Format("x{0}", Environment.Newline)
等を使用します。それでも、ここではC#の方が便利です。
"x" & nl & nl
または"x" + nl + nl
または"x" . $nl . $nl
いずれかの日を選択します"x\n\n"
。また"x" + bs + bs
以上"x\\\\"
。そして"x" + q + q
以上"x\"\""
/ "x"""""
。ここで、についてはString.Format
、上記で行っている比較とは無関係の別の問題です。
http://msdn.microsoft.com/en-us/library/aa691090.aspx
C#は、通常の文字列リテラルと逐語的文字列リテラルの2つの形式の文字列リテラルをサポートしています。
通常の文字列リテラルは、「hello」のように、二重引用符で囲まれた0個以上の文字で構成され、単純なエスケープシーケンス(タブ文字の\ tなど)と16進数およびUnicodeエスケープシーケンスの両方を含めることができます。
逐語的文字列リテラルは、@文字の後に二重引用符文字、0個以上の文字、および終了二重引用符文字が続く形式で構成されます。簡単な例は@ "hello"です。逐語的文字列リテラルでは、区切り文字の間の文字は逐語的に解釈されますが、唯一の例外は引用エスケープシーケンスです。特に、単純なエスケープシーケンスと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"
ます。