C# ゼロから理解するラムダ式:デリゲートからラムダ式、LINQへの流れ #2

前回の「C# ゼロから理解するラムダ式:はじめに #1」でも紹介したように、この連載ではC#のラムダ式について学んでいきます。ラムダ式は現代のC#では必須知識になっているので、できる限り覚えるようにしたいところです。

さて、今回は導入として全体の概要を押さえていきます。当連載で学ぶ「デリゲート」から「ラムダ式」そして「LINQ」まで、全体がどのようにしてつながっているのかを解説していきます。

まずは全体の背景知識を押さえなくては、「どうして学んでいるのか」の意図が軽薄になってしまうと感じているためです。重要なのは、それぞれが「どのようにつながり、進化を遂げてきたか」ということです。

ラムダ式の進化の過程

ラムダ式を理解するには、その進化の過程を追っていくことが重要です。ラムダ式もC#で実装されてきた機能を、より便利に昇華させていったものですので、ラムダ式が作られていく過程を学ぶとスッキリ理解できます。

ラムダ式はいきなりC#に実装されたわけではありません。C#は時間を経て徐々にラムダ式を利用していく形式へと進化したのです。まとめると以下のような形式でC#は拡充してきました。

  • C# 1.0 で delegate の実装が追加
  • C# 2.0 で 匿名メソッド の実装が追加
  • C# 3.0 で ラムダ式 の実装が追加

デリゲートから出発したC#は、ラムダ式を経由して「LINQ」が導入されることで、プログラミング言語としてひとつの完成形を迎えたといっても過言ではないのかもしれません。というのも、ラムダ式から発展したLINQが追加されたことにより、コレクション形式のデータがとても扱いやすくなり、より直感的なデータ操作が可能になったからです。

デリゲート

C#1.0で導入されたデリゲートは「処理をほかに委任する」という考え方による記述方法です。簡単に説明してしまうと、メソッドを格納できる変数を用意して、処理の中でいつでも呼べるようになるということです。

メリットは「処理をカプセル化できるようになったこと」でしたが、メソッドを必要な分だけ定義する必要があるため、そこまで柔軟ではなかったということがデメリットとして挙げられます。

匿名メソッド

C#2.0で導入された匿名メソッドは、デリゲートのデメリットであった「メソッドを使用する分だけ記述する」という点を改善するために実装されたイメージです。

匿名メソッドはメソッドを記述しなくても、その場でメソッドを定義することができる点で進化しました。この時にメソッド名を記述する必要のない点から「匿名」が付けられ「匿名メソッド」と呼ばれています。LINQの記述方法は、この匿名メソッドの流れを汲んでいます。

ラムダ式

ラムダ式は匿名メソッドをベースに生まれたものであり、こちらのほうが記述方法も簡潔になります。ラムダ式は「式木」としてコンパイルされるため、基本的にC#3.0以上はラムダ式を用いて記述されることが多いです。

式木とは式の意味を理解して表す木構造データのこと

ほとんど意味合いは匿名メソッドと変わりませんが、Predicate・Action・FuncやLINQを使用する際は基本的にラムダ式であるため、現代ではこちらがメインとなりました。

ラムダ式を学ぼう

ラムダ式を使用することで、C#ではシンプルな形式で処理の式を記述できるようになりました。しかしながら、シンプルになりすぎた分、逆に「どんな処理が記述されていㇽのかわかりづらい」という声を現場でも聞きます。

しかしながら、現状としてラムダ式を使う場面が多くなっているのは無視できません。私自身も最初は「どんな処理なのか分かりずらい」と感じていました。実際、はじめて見たときは意味が分かりませんでしたし、どうして「そのように記述するのか」があまり見えていませんでした。

過去の案件で「できる限りラムダ式を使用しましょう」という方針が打ち立てられたときに初めて、ラムダ式を少しだけ勉強するようになり、徐々にラムダ式を使用する場面が増えてきました。今ではラムダ式を活用してプログラムを記述する場面のほうが多いほどです。

最初は見様見真似で記述してきましたが、基本からラムダ式周辺をちゃんと学んだことで、式の意味・意図を理解できるようになりました。そうして、日々のコーディングの中でラムダ式使うことで徐々に抵抗がなくなっていったのです。

「ラムダ式が少し苦手」と感じている人は、今が学習のはじめ時なのです。ここでラムダ式を学んでおけば、もっと息の長いエンジニアとして活躍できること間違いありません。そのためにも問う講座を存分に活用してもらいたいと思います。