連載:〜ScottGu氏のブログより〜C# 4のオプション・パラメータと名前付き引数(そしてASP.NET MVC 2とのクールなシナリオ)Scott Guthrie 著/Chica 訳2010/04/05 |
|
|
[ブログに加え、現在Twitterを使って簡単な更新やリンク共有を行っています。twitter.com/scottguで、私をフォローしてください。]
これは、VS 2010および.NET 4リリースに向けたブログ投稿シリーズの第17弾です。
今回の投稿では、C# 4.0で追加された2つの新しい機能、オプション・パラメータと名前付き引数、さらには、ASP.NET MVC 2とともにオプション・パラメータを(VBおよびC#の両方で)利用するクールな方法をカバーします。
C# 4.0におけるオプション・パラメータ
C# 4.0ではメソッド、コンストラクタ、インデクサでオプション・パラメータが使用できます(注:VBでは少し前からオプション・パラメータをサポートしています)。
パラメータがオプション・パラメータとなるのは、宣言の一部としてデフォルト値が指定されている場合です。例えば以下のメソッドは、2つのパラメータ、文字列型の“category”と整数型の“pageIndex”を取ります。“pageIndex”パラメータはデフォルト値の0があり、こういったものがオプション・パラメータです。
図1 |
上記のメソッドを呼び出すとき、2つのパラメータをそこへ明示的に引き渡せます。
図2 |
または、2つ目のオプション・パラメータの引き渡しを省略すことも可能で、この場合、デフォルト値の0が引き渡されます。
図3 |
VS 2010のIntelliSenseでは、パラメータがオプションであることを示され、またそのデフォルト値がステートメントの完了時に表示される点にご注目ください。
図4 |
C# 4.0での名前付き引数とオプション・パラメータ
C# 4.0は“名前付き引数”という概念もサポートするようになりました。これにより、引数の場所にただ指定するのではなく、メソッドへ引き渡す引数に明示的に名前を付けられます。
例えば、GetProductsByCategoryメソッドへ引き渡す2つ目の引数を名前で明示的に指定する、以下のようなコードが書けます(その使用方法をもう少し明確にします)。
図5 |
名前付きの引数は、メソッドが複数のオプション・パラメータをサポートし、引き渡したい引数を指定したい場合に、非常に便利です。例えば、以下は2つのオプション・パラメータを取るDoSomethingメソッドです。
図6 |
名前付き引数を使って、以下のいずれの方法でも上記のメソッドを呼び出せます。
図7 |
両方のパラメータがオプションなので、1個(または0個)のパラメータを指定すると、指定していない引数にはデフォルト値が引き渡されます。
ASP.NET MVC 2とオプション・パラメータ
VBおよびC#のオプション・パラメータのサポートを利用する素晴らしい使用方法のシナリオの1つが、ASP.NET MVC 2のコントローラ・クラス上のアクション・メソッドへの入力バインディング・サポートです。
例えば、“Products/Browse/Beverages”または“Products/Browse/Deserts”のようなURLをコントローラのアクション・メソッドへマップしたいというシナリオを考えます。これは以下のように、メソッドへURLをマップするURLのルーティング・ルールを書くとことで可能になります。
図8 |
そうすると、オプションで“page”クエリ文字列の値を使用して、例えば、/Products/Browse/Beverages?page=2のように、Browseメソッドで表示される結果をページ分けするかどうか、そしてその場合、結果のどのページを表示すべきかを指定できます。
ASP.NET MVC 1では、通常このシナリオはアクション・メソッドへ“page”パラメータを追加して、それをnullable int(Null許容型のint)にすることで処理してきたと思います(つまり、“page”クエリ文字列の値がない場合はnullになります)。従って、以下のようなコードを書けば、nullable intをintに変換でき、クエリ文字列にそれがない場合は、そこへデフォルト値を割り当てられます。
図9 |
ASP.NET MVC 2では、VBおよびC#のオプション・パラメータ・サポートを利用して、この動作をより簡潔で明白に表現できます。単純に、アクション・メソッドのパラメータを、デフォルト値のあるオプション・パラメータとして宣言します。
C#
図10 |
VB
図11 |
もし“page”の値がクエリ文字列にある場合(例:/Products/Browse/Beverages?page=22)、それは整数としてアクション・メソッドへ引き渡されます。もし“page”の値がクエリ文字列にない場合(例: /Products/Browse/Beverages)、アクション・メソッドには0のデフォルト値が引き渡されます。これにより、コードがもう少し簡潔で読みやすくなります。
まとめ
VS 2010のC#およびVBには数多くの素晴らしい新しい言語機能があります。上記の2つの機能(オプション・パラメータと名前付き引数)もそうです。今後、数週間、数カ月間で、より多くのことについてブログ投稿する予定です。
もしC#(C# 4.0を含む)の言語機能のすべてを要約し、コアとなる.NETクラス・ライブラリをうまくまとめている書籍をお探しなら、新しくリリースされたO'ReillyのC# 4.0 in a Nutshellもチェックしてみてください。
図12 |
多くのコンテンツを非常にうまくまとめており、記述例も簡単に探し出せます。
Hope this helps,
「〜ScottGu氏のブログより〜」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|