BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース 進歩を見せる .NET のオプションパラメータ

進歩を見せる .NET のオプションパラメータ

原文(投稿日:2010/07/06)へのリンク

オプションパラメータは最初から .NET に含まれていたが,C# でサポートされないこともあり,COM ライブラリ関連以外での使用はタブーである,という解釈が一般的だった。C# 4 でオプションパラメータがサポートされるようになるので,今後はレガシーなコード以外でも多く見られるようになりそうだ。また C# 以外にも,動的言語との相互運用性や変更不能(immutable)なデータ構造体,さらに ASP.NET MVC のさまざまな部分でも使われるようになるだろう。

それでも .NET のオプションパラメータの主要な用途が COM であることは,当然ながら変わらない。Office のようにパラメータが 20 個以上の関数があるライブラリを扱う場合,手作業ですべての引数を指定するのはとんでもなく面倒な作業だ。さらにラベルがもし使えないなら,引数とパラメータを対応させるために位置を数えるという,間違いやすい作業が残ることになる。COM を知らない読者のために説明しておくと,COM が作られた頃には,一般的な言語がすべて関数オーバーロードをサポートしていた訳ではなかった。省略可能なパラメータを持った関数も普通の関数として扱われていたのだから,当時としては止むを得ないものだったのだ。

このような COM プログラマの不満に加えて,C# チームは C# 4 を,DLR サポートのための遅延バインディング導入のチャンスとしても利用した。彼らがサポートしたかった機能は実はこれだけであって,その他は付け足しに過ぎない。明示的な型指定を持たない動的言語では,パラメータ型による関数オーバーロードはできない。そのためにオプションパラメータが必要なのだ。

マルチコアあるいはマルチ CPU の普及によって,並行性・同時性は以前よりも一般的な問題になった。その共通的トピックのひとつに,不変(immutable) データ構造の有用性とその定義に関する問題がある。すべてのプロパティに値を設定する必要があるなら,標準的なコンストラクタだけで十分だが,プロパティの大部分がオプションであるような場合には,状況はもう少し複雑になる。ある程度まではコンストラクタのオーバーロードで対応可能だが,それ以降については Java や 旧バージョンの C# ならばビルダーパターンを使うことが多い。しかしオプションパラメータがあれば,そのような場合でも単一のコンストラクタで簡単に処理することができるのだ。

ASP.NET MVC 2 のコントローラは,クエリ文字列パラメータのデフォルト値をサポートするようになった。デフォルト指定は属性を用いて行うため,C# あるいは VB のオプションパラメータで指示するのがもっとも簡潔な方法だ。

Microsoft の Razor view engine for ASP.NET MVC では,HTML ヘルパでオプションパラメータを使用している。これによって,自己記述型コードスタイルを提供するヘルパに数多くのオプションを追加することが可能になった。さらに Razor は一歩進んで,ラムダあるいは匿名デリゲートなどの記述を使わずに,式をデリゲートに自動転換する機能もサポートされている。

オプションパラメータが使用できない場面もある。例えば,すべての言語がサポートすべき CLR のサブセット定義である共通言語仕様 (Common Language Specification) では,オプションパラメータの使用が明示的に禁止されている。これはつまり,オプションパラメータは Base Class Library では使用されない,従って .NET フレームワークと共に配布されるライブラリでも使われない,ということだ。ただし CodePlex を通じてリリースされるライブラリは例外であり,これらのルールが厳密には適用されていない。

この記事に星をつける

おすすめ度
スタイル

BT