連載:[完全版]究極のC#プログラミングChapter16 LINQとメソッド構文川俣 晶2010/03/29 |
|
同書籍は、もともと本フォーラムにて連載していた『C# 2.0入門』、『C# 3.0入門』の記事を整理統合し、加筆、修正されたものです。 手元でまとめて読みたい方は、ぜひ書店などにてお買い求めください。 【注意】本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。 |
16.1 予約語のエスケープ
まず軽いが重要な話題から入っていこう。
クエリ式によくあるワナとして、クエリ式の予約語と使用するキーワードが衝突するという問題がある。
たとえば、これといって特にひねったコーディングは行っていない次のリスト16.1を見ていただきたい。移動経路クラスのfromとtoはpublicなフィールドだから、FromとToにすべきだよな、といった感想は出るかもしれないが、それは名前付けルールの問題であって、コンパイルが通らないような問題ではない。
しかし、このコードはコンパイルできない。
| |
リスト16.1 コンパイルできないサンプル |
| |
リスト16.1で発生するコンパイルエラー |
多数のエラーが出ていてわかりにくいが、要するにwhere句の「n.from == "新宿"」という式で使われたfromは無効だということである。
なぜ無効かといえば、fromはfrom句で使用されるキーワードだからである。しかし、ここがきわめて悩ましいところなのだが、fromはC#の予約語だから使用できない、というわけではない。クエリ式の外部に記述されたfromはいっさいエラーの対象になっていないのである。
これは、C#の言語仕様拡張のポリシーによって発生した事態といえる。C#では、言語仕様が拡張され、新しいキーワードが導入されるとき、それを予約語扱いしないようになっている。そして、そのキーワードは新規に追加された構文内でのみ特別な意味を発揮するようになっているのである。クエリ式のキーワードも同じで、それに該当する以下のキーワードはクエリ式内でのみ特別な意味を持つようになっている。
from、join、on、equals、into、let、orderby、ascending、descending、select、group、by
つまり、fromは、クエリ式以外では普通に記述できて普通に機能する何の変哲もないキーワードであるにもかかわらず、クエリ式では使用することができない。
このような問題を解決するために、C#はもともと「プリフィックス」(@)という機能を持っている。これは、意味のあるキーワードと重複するキーワードを記述する際、先頭に@記号を付けることで、特別な意味付けを発揮させないものである。
上記のリスト16.1では、where句のfromの先頭に@を付ければよい。
|
|
これでコンパイルでき、実行できる。
| |
リスト16.1の修正後の実行結果 |
もっとも、このプリフィックス「@」はくせもので、悪用するとパッと見た目に反する動作をさせることもできてしまう。次のリスト16.2は、「@false」という名前の定数にtrueの値を割り当てることで、条件判断の見た目の印象を逆転させた例である。
| |
リスト16.2 プリフィックス「@」の悪用例 |
このように、プリフィックス「@」はクエリ式では必須の存在だが、どこで使ってもよいものではない。どうしても必要な場面だけで使うようにしよう。
「[完全版]究極のC#プログラミング」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|