うら干物書き

ゲームを作っています。

【C#】逐語的識別子@ナニソレ.com

 自分が使っていない記法など、知る機会が無ければずっと知らないままです。
 そのため他の人が書いたコードなどを見るのはとても勉強になっています。
 今回、僕が気になったのはこのコードです。

int @value = 100;

 な、なんでしょうね、この@


 インターネット上でいろいろなコードを見ていく中で、こんなコードを見ました。
 
int @value = 100;

 変数名の前にア、@マークが……、どうしたんだ。
 私の知らない武器が内蔵されているのか!

 気分としては敵対しているモビルスーツが突然光りだしたシロッコと同じ気分ですが、実際同じコードを書いてコンパイルしてみても特にエラーは出ないので、どうやら正式な仕様のようです。

 なんなのでしょうね、この@マークは。
 ネットから情報を仕入れましょう。

f:id:urahimono:20170520225833p:plain

 …。
 ……。

 くっ、関係ないサイトばかり引っかかる!
 @マークだから、メールアドレスとかそんなのばっかりが引っかかる。

 苦労の末にたどり着いた、この記法の名前は、

 逐語的識別子!

2.4.2 識別子 (C#)

 な、なんかカッコいい名前だなぁ。
 えーと、なになに、

文字 @ は実際には識別子の一部ではなく、ほかの言語ではプリフィックスのない通常の識別子として認識されます。

 ほほう、@マークが頭に付いているものと付いていない同名の変数は同じものと認識されるようですね。
 試してみましょう。

public int TestMethod( int i_arg )
{
    int @value  = 100;
    value      *= 2;

    return @value + i_arg;
}

 宣言してるのは@valueなのに、valueの名前でも普通に使えていますねー。
 へぇー、面白いですね。
 ……で、これ何のために使うの。

“@” 文字をプリフィックスとすることでキーワードを識別子として使用できる

ああ、なるほど。
intとかifとか、コードを記述するうえでキーワードとなっている名前の変数を作ることが出来るわけですか。

public int TestMethod( int i_arg )
{
    int @int    = 100;

    // エラー さすがにキーワードにある名前を@抜きでは使えないようだね。
    // int *= 2;

    return @int + i_arg;
}

 確かに使えますね。
 さすがにキーワードにある名前を@抜きで使用しようとするとエラーが発生しましたが。
 へぇー、面白いですね。
 ……で、これ何のために使うの!

プリフィックスとして “@” を付加すると、キーワードを識別子として使うことができ、ほかのプログラミング言語と整合させる場合に立ちます。

 ああ、なるほど別のプログラミング言語では使えていた変数名をC#移植した際に使えなくなった場合とかに使うのですね。
 へぇー、面白いですね。
 ……で、これ……

キーワードではない識別子に @ プリフィックスを使用してもかまいませんが、スタイルの問題としてできる限り使用しないことをお勧めします。

 だよね!
 あんまり多用していい方法ではないよね!

 とりあえずこの逐語的識別子は、記憶の片隅にでも覚えておきます。