verbatim identifier でキーワードを識別子に使う方法

このエントリは C# Advent Calendar jp: 2010 の 8 日目のものです。
C# 内で C# のキーワードを識別子として使いたい場合、verbatim identifier を使います。
verbatim identifier は、識別子もしくはキーワードの先頭に @ を付けたものです。
例えば、

// intという変数はそのままでは作れないのが、
// verbatim identifierとしてなら作れる
var @int = 10;

このような感じです。
この @ には (配列を表したり、インスタンス変数を表すなどの) 意味はありません。
@ に意味がないので、

// @はキーワード以外にももちろんつけることができる
var @i = 10;
var i = 20;

これは i を二回定義しようとしているため、コンパイルエラーになります。


さて、verbatim identifier はわかりました。では、これはどういう場面で使えばいいのでしょうか。
ぱっと思いつく使い道としては、

  • 多言語との連携を行う
  • 自動生成

があります。

多言語との連携

例えば HTML との連携を考えましょう。
HTML には、class 属性や readonly 属性という、C# ではキーワードとなっている属性があります。
ASP.NET MVC を使う場合、要素に対する属性を無名クラスという形で指定できるのですが、ここで verbatim identifier を使用します。

<%: Html.ActionLink("ホーム", "Index", null, new { @class = "Navigator" }) %>

自動生成

例えば T4 Template などで、ある表現から C# のコードに変換する場合などです。
こういった場合、キーワードを含む場合にアンダーバーなどを付けて避けることもできます。
しかし、C# の場合、外部に公開するようなメンバはすべて大文字で始まるうえ、C# では大文字と小文字を区別するので、C# 内でしか使わないならそもそも @ も _ も不要です。
そうではなく、外部に公開しないような、たとえば private フィールドの場合、わざわざ _ を付けて別表現にして避けるのも微妙なので、verbatim identifier を使う、ということが考えられます。
ただし・・・

public string Value
{
    get { return @value; }
    set { @value = value ?? ""; }
}
string @value = "";

これ、setter でフィールドに値を設定できていません。
最初に述べたとおり、@ に意味はないです。つまり、setter は

set { value = value ?? ""; }

です。value に value 入れても何の意味もないですよね。
そもそも、value はコンテキストキーワードであって、別に verbatim identifier とする必要はないです。

public string Value
{
    get { return value; }
    set { this.value = value; }
}
string value = "";

こんな感じで、this 使えばいいだけでしたとさ。

次は・・・

二郎で有名なあの人ですね。楽しみ。