連載:[完全版]究極のC#プログラミング

Chapter7 ラムダ式(後編)

川俣 晶
2009/11/02

7.6 何もしないラムダ式

 盲点になることもある話題なので、「何もしないラムダ式」の書き方も説明しておく。

 ラムダ式に戻り値がない場合(voidの場合)でかつ、内容を空としたい場合(呼び出しても何も実行しないラムダ式を選択的に使いたい場合)、ステートメント型のラムダとして空の内容を記述することができる。

 たとえば、次のようなラムダ式である。

(x) => { };

 このようなラムダ式は、リファクタリングでいう「ヌル(ナル*4)オブジェクトの導入」に当たる機能を持つ*5。つまり、処理すべき式が存在しないことをnullで示すのではなく、何も処理しないラムダ式を呼ばせるという手法である。

 このテクニックを使わない場合と使う場合のコード例をそれぞれ示す。

 まず、このテクニックを使わない場合である。リスト7.16のコードは、実行すべき処理がない場合にnull値でそれを示すケースである。Sampleメソッドの引数actionは、値がnullではない場合に限って呼び出される。

using System;

class Program
{
  private static void Sample(Action<string> action)
  {
    if (action != null) action("Hello!");
  }

  static void Main(string[] args)
  {
    Action<string> action = null;
    Sample(action);

    action = (x) => Console.WriteLine(x);
    Sample(action); // 出力:Hello!
  }
}
リスト7.16 実行すべき処理がない場合をnullで示した例

 これに対して、次のリスト7.17は実行すべき処理がない場合、空のラムダ式で示したケースである。Sampleメソッドは、引数actionがnullか否かを判定する必要がない。もし、処理すべき内容が存在しない場合は、単純に空文のみのラムダ式が実行されて何もせず戻ってくる。

using System;

class Program
{
  private static void Sample(Action<string> action)
  {
    action("Hello!");
  }

  static void Main(string[] args)
  {
    Action<string> action = (x) => { };
    Sample(action);

    action = (x) => Console.WriteLine(x);
    Sample(action); // 出力:Hello!
  }
}
リスト7.17 実行すべき処理がない場合を空文で示した例

 このような「何もしないラムダ式(あるいは、従来であれば匿名メソッド)」は、筆者がわりとよく使うテクニックである。

 たとえば、筆者が書いたとあるプログラムでは、ユーザーの操作をジャーナリングしてプレイバックする機能を持っていて、それによって自動テストを行っている。その際、プレイバック中は出力に関する処理をすべて抑止して高速に実行させるようにしているが、それらは、出力を行うメソッド呼び出しにいちいち条件判断を付けるのではなく、呼び出し先を「何もしないラムダ式(匿名メソッド)」に差し替えることで実現している。これにより、ソースコードの簡潔さを維持したまま、気軽にいつでも実行できる程度に自動テストを高速化することに成功している。

*4 nullは通常、「ナル」に近い発音とされる。リファクタリングのバイブルともいえるマーチン・ファウラー他著『リファクタリング:プログラミングの体質改善テクニック』(2000年、ピアソン・エデュケーション刊、ISBN 4894712288)では「ナルオブジェクト」と表記されているので併記する。
*5 ラムダ式自身は厳密にはナル(ヌル)オブジェクトではなく、ナル(ヌル)オブジェクトに含まれる何もしないメソッドに対応する。


 INDEX
  [完全版]究極のC#プログラミング
  Chapter7 ラムダ式(後編)
    1.7.1 ラムダ式は何をもたらすか?
    2.7.2 ラムダ式と匿名メソッドの違い
    3.7.3 ステートメント型のラムダ
    4.7.4 式形式のラムダの可能性
    5.7.5 型指定を省略できる場合、できない場合
  6.7.6 何もしないラムダ式
    7.7.7 ラムダ式の使用例/【C#olumn】「=>」は不等号?
    8.7.8 ラムダ式のさまざまなバリエーション
    9.7.9 ジェネリックメソッドと型推論
    10.7.10 オーバーロードの解決/値型と参照型の相違は何か?/練習問題
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」


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 記事ランキング

本日 月間