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 使えばいいだけでしたとさ。
次は・・・
二郎で有名なあの人ですね。楽しみ。