2015-10-29 21 views
26

The "@" character is allowed as a prefix to enable keywords to be used as identifiers. .netの開発者の多くはこれについて知っています。Cの識別子の接頭辞@

でもわからないもの: 2つの識別子は、接頭辞「@」を取り除いても同じであるとみなされます。

ので

static void Main(string[] args) 
{ 
    int x = 123; 
    Console.WriteLine(@x); 
} 

は絶対に有効なコードやプリントコンソールに123です。

私は仕様にそのようなルールがあり、実際の状況でこの機能をどのように使用できるのか不思議です(識別子がキーワードでない場合は識別子の前に "@"を付けても意味がありません) ?)。

+1

なぜ「@ x」が有効であるかについての質問でした。申し訳ありませんが私はあなたの質問を最初に持っていませんでした。テストのために 'nameof(@x)'も表示することができ、 'x'が表示されます。 –

答えて

38

完全に論理です。 @は名前の一部ではありませんが、後に来るものをキーワードではなく識別子として扱う特別な指標です。

+1

"@"は識別子の一部ではなく、残りの識別子を "エスケープ"する役割しか果たしません。 – sleblanc

+3

言い換えれば、名前が明白に識別子である場合、特別な場合として省略することができる必須のsigilです。 – Kevin

14

C#コードを生成するプログラムの例を考えてみましょう。たとえば、データベーステーブルの列を受け取り、それに相当するC# POCOオブジェクトを作成し、列ごとに1つのプロパティを作成するものを考えてみましょう。

列名の1つがC#キーワードと一致するとどうなりますか? すべてのプロパティ名の先頭に@がある場合、コード生成プログラムはどの単語がキーワードであるかを覚えておく必要はありません。
フェイルセーフです。特別な@文字はコードをまったく傷つけません!

+0

私はこれが正しい方向だと思う、以前にそれを予測することができないキーワードを使用するかもしれないいくつかの一般的なケースがあります。ここではT4テンプレートが良い例です。 – mikus

18

エリックリペットはそれについて非常に良い記事があります。Verbatim Identifier

それは任意の識別子が そのまま識別子にすることができるということですなぜ私は時折尋ねています。 の逐語的な識別子を予約されたキーワードと文脈のキーワードに限定してみませんか?

答えは簡単です。 C#2.0が出荷された日である に戻ったとします。 C#1.0プログラムでは、識別子としてyield を使用しています。これは完全に合理的です。 「利回り」は、多くのビジネスおよび科学的アプリケーションにおいて共通の という用語です。現在、C#2.0は、 という慎重に設計されており、yieldを 識別子として使用するC#1.0プログラムは、まだ有効なC#2.0プログラムです。戻り値の前に表示されるときには特別な という意味しか持たず、C# 1.0プログラムではこれは起こりませんでした。しかし、あなたは、あなたのプログラムの収穫物の用途を逐語的な識別子としてマークすることに決めました。これは、 のコードの将来の読者には、 の識別子ではなく、識別子として使用されています。

7

他の答えは、なぜその動作が存在するのかについてはっきりしていますが、識別子が等しいものとして扱われるルールを見てみる価値があると思います。

仕様セクションの引用2.4。2:次の変換が適用された後、彼らは順番に、同一である場合

二つの識別子は同じとみなされます:使用している場合

  • 接頭辞を「@」、削除され
  • Unicodeエスケープシーケンスは対応するUnicode文字に変換されます。
  • 書式設定文字が削除されます。これらのルールに続き

@xxと同じです。

+3

私はこの答えが非常に役に立つとは思わない。 OPはこれを仕様に入れていますか?彼はすでに '@ x'が' x'と同じであることを知っています。 –

+0

@MatthewSainsbury - その機能が存在する理由をカバーする他の3つの回答が既にあります。 **これらの回答を補完して識別子を比較するための規則に関する情報を追加することを意図しています。私は明確にするためにいくつかのテキストを追加しました。 – theB

4

それは確実性を提供する:@wordを使用

  • は将来性です。
    後でキーワードにする必要はありません。
  • ほとんどのプログラマーはすべてのキーワードに慣れていません(C#には約100個のキーワードがあります)
  • 最近のkeywordsは「コンテキスト」なので、時にはキーワードではありません。
+1

FWIW、C#は現在、*正確に* 100個のキーワードを持っています(その多くは文脈上のものです)。 6.0で 'nameof'を追加すると101になりますが、 –

+0

は103とカウントされます。 "によって" – buffjape

+0

本当に?アルファベット順にすべてのキーワードに名前を付けることができる私のパーティー/インタビューのトリックは(今までの4ヶ国語で)更新する必要があるかもしれません...(私は変わったパーティーに行く...) –

関連する問題