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

C#でラムダ式を書く方法 #07_delegateの使い方

前回はGetValue3メソッドの引数にLenCheckのdelegateを受ける実装を行ったので,今回は,どうやってdelegateを渡すかというところやって行きたいと思います。

GetValue3メソッドを呼び出す方法

まずは,button3_ClickイベントからGetValue3メソッドを呼び出すように書いてみましょう。GetValue2としていた部分をGetValue3に変更します。

GetValue3の第1引数はstring配列なので,これまでと変わりませんが,第2引数は,delegateになっているため,「ここをどう書くか」というお話をしていきます。delegate引数の渡し方は,いくつか書き方がありますが,まずは一番簡単な方法からやっていきましょう。

メソッドでdelegateを渡す方法

一番簡単な方法は,メソッドでdelegateを渡す方法です。
もう一度定義したdelegateを見てみましょう。

stringを投げたらboolを返すという定義でしたね。delegate引数には,この「stringを投げたらboolを返す」という定義と同じ定義のメソッドを作成し,そのメソッド名を渡すことで,delegate引数に渡すことができます。

メソッドは例えば次のような感じで書きます。

戻り値がboolで,引数がstring 1つになっていればOKです。メソッド名は何でも構いません。今回はShiki1としています。こんな感じで引数と戻り値を,delegateであるLenCheckに合わせておけば,LenCheckとして引数に使うことができます。

当然このメソッドは戻り値がboolなわけですから,何かしらboolを返却してあげる必要があるわけです。ここで何を返却するかというと,これまで言ってきたように,「>=3

」や,「==3」など,「どういった判定をするか?」という部分を記述すればいいわけです。今回は「value.Length == 3」とすることで,文字列が3文字の文字列の場合のみTrueが返却されるように実装しています。ちなみにメソッドの中身は,何行でも構いません。今回は1行になっていますが,複数行でももちろんOKです。普通のメソッドなので,とにかくboolを返却していれば問題ありません。 こんな出てきたらこのメソッドの名前「Shiki1」を,GetValue3の第2引数に設定すればOKです。

GetValue3の第2引数に,「ここをどうやってわたすか」と記載していましたが,Shiki1に変更しました。これでコンパイルエラーが消えているはずです。

このように記載するとGetValue3を 呼び出した時に,Shiki1が,GetValue3のlenCheckに 渡ることになるので,その中で使われているif文のlenCheck(val)の部分は,「==3」かどうかで判定した結果のboolが返却されることになり,結果としては,3文字の文字列のみが出力されることになります。

実行

実行してbutton3を押下します。

3文字である「CCC」のみが出力されることが確認できます。

これでShiki1の3文字かどうかのチェックが行われているということが確認できます。 

別の式を投げる

同じ要領で別の式を投げるということも当然できます。デザイン画面でボタンをもう1つ追加しましょう。

button4を画面に追加したら,ダブルクリックをして,クリックイベントを自動生成します。

button4_Clickイベントに次のように記載し,さらにShiki2メソッドを作成し,それを呼び出すようにします。

Shiki2メソッドは4文字以上の時にTrueを返却するように実装しました。Shiki2を呼び出しているbutton4_Clickでは,4文字以上の文字列だけを出力するようになるはずです。 

実行

実行してbutton4を押下します。

4文字以上の文字列のみが表示されていることが確認できます。

ポイントは,button3_Clickもbutton4_Clickも,GetValue3を呼び出しているのですが,delegateであるLenCheckの部分にShiki1を渡すか,Shiki2を渡すかの違いで,GetValue3にどういった判定をさせるかを変化させているということです。delegateを使うことで,引数に「式」を投げることに成功しているということです。これにより,今までの値を引数にするということに加えて式(メソッド)を引数にすることが可能であるということが理解していただけたと思います。ラムダ式を理解するうえで,このdelegateによる式を引数にするという考え方が,非常に重要な考え方になります。

delegateはC#1.0からある機能なのですが,C#2.0,C#3.0と進化するなかで,delegateというキーワード自体は,直接書かなくても,プログラミングできるようにはなってきていますが,すべての根底にはこのdelegateがあり,そこからラムダ式までの道が続いているので,ここまでが理解できていないようであれば,復習をして,ここまでがしっかり理解できた状態で,次に進んでください。こういった技術書は,途中でつまずいてしまうと,その後が理解できなくなり,読むのをやめてしまうことになります。私も分厚い本を途中で挫折した経験が何度もあります。そういった失敗を分析すると,必ず,途中で何かを見失っているということです。理解しないまま進むと,その先はさらに理解できず,いやになってやめてしまいます。本書はつまずくほど分厚い本ではないので,最後まで読み続けていただけると思いますが,焦らずにゆっくりと読んで,1つずつ,しっかり理解するのが,完読するコツだと私は思っています。

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

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_さいごに

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