C#でラムダ式を書く方法1

C#でラムダ式を書く方法 #10_Predicateの使い方

ここまででdelegateや匿名メソッドまでを解説してきました。今回はPredicate(プレディケート)に関して解説して行きます。

プレディケートというのはマイクロソフトのクラスライブラリーで既に定義されているdelegateです。

これまでのコード

これまでは次のような感じでdelegateを宣言して実装していました。LenCheckのような感じでdelegateを宣言し引数として使っていましたね。

「delegate bool LenCheck(string value);」の部分です。Predicateを使うと,この,delegateの宣言が不要になるというお話です。

C#2.0からは,Predicateが登場し引数が1つで,戻り値がboolの場合は,わざわざdelegateを宣言しなくても実装できるようになりました。

実際コードを書いた方が分かりやすいと思うのでさっそく書いていきましょう。 

ボタンの追加

いつものようにボタンを追加します。今回はbutton8です。

ボタンを貼り付けたら,ダブルクリックしてクリックイベントを自動生成させます。

GetValue8メソッドの作成

フリゲートを使うとどのような実数になるかを理解するために,以前作成したGetValue3の一部を改造して実装します。以前作成したGetValue3メソッドをコピーして貼り付け,新たにGetValue8メソッドとして実装します。メソッド名をGetValue8としておいてください。

ボタンクリックイベント8の追記

それでは先ほど作成したbutton8_Clickイベントで,今作成したGetValue8メソッドを呼び出すように実装します。button8_Clickイベントは,以前作成したbutton6_Clickのコードをコピーしてきて貼り付け,GetValue3メソッド呼び出し部分を,GetValue8に変更しておきます。

GetValue8をPredicateに変更

こんばんはだと今までやってきたやり方と同じで,delegateであるLenCheckが必要な実装になっているため,LenCheckの部分を,Predicateに置き換えます。

GetValue8のLenCheckの部分をPredicate<string>に変更してください。

これでGetValue8では,LenCheckの使用がなくなり,Predicateに置き換わりました。これでもコンパイルがちゃんと通っているはずです。それでは何が起きているのか解説して行きましょう。

Predicateの定義とは

Predicateと実装した部分にカーソルをかざしてみてください。

次のように定義が表示されるはずです。

ここにPredicateの定義が記載されています。

「delegate bool System.Predicate<in T>(T obj)」

と書いてますね。

delegateで始まっていることからもわかるように,Predicateとはdelegateです。これはマイクロソフトのクラスライブラリーで予め定義されているdelegateということになります。なので定義を見れば,どのようなdelegateかということは理解できます。「delegate bool System.Predicate<in T>(T obj)」

delegateに続いてboolと書かれているため,戻り値はboolということです。「System.Predicate」の部分はdelegateの名前,<in T>(T obj)の部分は,引数が1つで,型は「T」になっています。要するに,使用する際に,型を指定できるということです。これはC#2.0で追加されたジェネリックという型指定の機能です。使用する際に型を指定すればよいということです。なので,このdelegateは「1つの任意の型を引数に渡すと,boolが返ってくる」という定義であるということがわかります。

おそらくマイクロソフトでは,このパターンが大変多く使われるということからこういった定義を作成したものと思います。引数の型は任意の型なので,intでもstringでもクラスでもいいため,非常に汎用的に使うことができます。また結果もboolなので,何かの判定に使うためのdelegateであれば使い勝手がいいわけです。

ということでこれまでやってきたLenCheckのdelegateは,引数がstringで戻り値がboolなので,Predicateに置き換えることができます。そういった理由から,GetValue8メソッドのLenCheckをPredicateに置き換えてもコンパイルエラーが出ないということです。

そして最も重要なことが,これまで宣言していたLenCheckの様なデリゲットが不要になるということです。

この部分ですね。

なので,任意の引数1個と,戻り値がboolという型であればPredicateが使えるということです。 

実行

それでは実行して動作するかを確認してみましょう。

「CCC」と出力され,3文字の文字列のみが抽出されていることがわかります。LenCheckのdelegateがなくてもPredicateで動作しているということが確認できました。

わざわざdelegateを宣言しなくてもいいので,C#2.0の型指定の恩恵を受け,便利になったということです。次回はC#3.0の世界に入ります。さらに便利になりますので,ご期待ください。

オブジェクト指向の原則 単一責務の原則

C#を正しい3層構造で造れてますか?

非売品コースを受け取る

#00_はじめに
#01_単一責務の原則とは
#02_原則違反の例
#03_変更理由単位でクラスを分ける
#04_3層構造の例
#05_修正箇所を最小にできる
#06_修正する場所が明確になる
#07_共通化しましょうという話ではない
#08_少々悪いコードでも問題視しない理由
#09_探しやすいコード
#10_クラスは機能ごとに小さく作る
#11_小さなクラスがそれぞれに協調して目的を達成させる
#12_多数の部品群のなかから摘まんで作る
#13_クラスはどこまで小さくすればいいのか
#14_アンダーソン式単一責務の原則
#15_最小カプセルの検証_監視タイマークラス
#16_最小カプセルの検証_受注画面クラス
#17_最小カプセルの検証_ユーザークラス
#18_最小カプセルの検証_商品マスターデータアクセス
#19_登場人物に合わせたモデリングの四角と線
#20_四角と線を最小カプセル化する
#21_アンダーソン式手順
#22_パターンを見つけ出す
#23_プログラミングの自問
#24_さいごに

【参考図書】ピーコックアンダーソンが参考にした書籍一覧