|
|
連載:[完全版]究極のC#プログラミング
Chapter7 ラムダ式(後編)
川俣 晶
2009/11/02 |
![](/fdotnet/extremecs/index/extremecs_m.jpg) |
|
7.6 何もしないラムダ式
盲点になることもある話題なので、「何もしないラムダ式」の書き方も説明しておく。
ラムダ式に戻り値がない場合(voidの場合)でかつ、内容を空としたい場合(呼び出しても何も実行しないラムダ式を選択的に使いたい場合)、ステートメント型のラムダとして空の内容を記述することができる。
たとえば、次のようなラムダ式である。
このようなラムダ式は、リファクタリングでいう「ヌル(ナル*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 ラムダ式自身は厳密にはナル(ヌル)オブジェクトではなく、ナル(ヌル)オブジェクトに含まれる何もしないメソッドに対応する。
|
Insider.NET 記事ランキング
本日
月間