連載:〜ScottGu氏のブログより〜

C# 4のオプション・パラメータと名前付き引数(そしてASP.NET MVC 2とのクールなシナリオ)

Scott Guthrie 著/Chica
2010/04/05

 本記事は、Microsoftの本社副社長であり、ASP.NETやSilverlightなどの開発チームを率いるScott Guthrie氏のブログを翻訳したものです。氏の許可を得て転載しています。

[ブログに加え、現在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 intintに変換でき、クエリ文字列にそれがない場合は、そこへデフォルト値を割り当てられます。


図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,

 ScottEnd of Article

   
 
インデックス・ページヘ  「〜ScottGu氏のブログより〜」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間