C#のラムダ式とデリゲートの違いをやさしく比較!初心者でもわかる基本解説
生徒
「C#の勉強をしていたら、ラムダ式とデリゲートって言葉が出てきました。どっちも似ていて違いがわかりません。」
先生
「確かに初めて見ると混乱しますね。どちらも“処理をまとめて扱う仕組み”ですが、役割が少し違います。」
生徒
「パソコンをほとんど触ったことがなくても理解できますか?」
先生
「大丈夫です。身近なたとえを使いながら、順番に説明していきましょう。」
1. デリゲートとは何か?
C#のデリゲートとは、「あとで実行する処理の名前を入れておく箱」のようなものです。 普段の生活でたとえると、「電話番号を書いたメモ」に近い存在です。 実際に電話をかけるのではなく、「この番号に電話する」という情報だけを持っておき、必要なときに使います。
プログラミングでは、処理とは「画面に文字を表示する」「計算する」といった動作のことを指します。 デリゲートは、その処理を直接実行するのではなく、「この形の処理を呼び出せますよ」という約束を表します。 この約束を型と呼びます。型とは「どんな形のデータか」を示すルールのことです。
delegate void MessageDelegate();
上の例では、「引数がなく、何も返さない処理」を入れられるデリゲートを定義しています。 少し難しく感じるかもしれませんが、「使い道を決める設計図」だと考えると理解しやすくなります。
2. ラムダ式とは何か?
ラムダ式は、「その場で処理の中身を書くための短い書き方」です。 たとえるなら、「電話帳に登録するほどではないけれど、今すぐ使いたい番号」を紙にサッと書くイメージです。
通常、処理を書くときはメソッドという形で名前を付けます。 しかし、短くて一度しか使わない処理の場合、わざわざ名前を付けるのは手間になります。 そこで使われるのがラムダ式です。
() => Console.WriteLine("こんにちは");
この書き方は、「引数なしで、画面に文字を表示する処理」を意味しています。
=> は「この結果を実行する」という矢印のような記号だと考えてください。
3. ラムダ式とデリゲートの決定的な違い
初心者の方が一番つまずきやすいのは、「結局どこが違うのか」という点です。 簡単にまとめると、デリゲートは入れ物のルール、ラムダ式は中に入れる中身です。
デリゲートは「こういう形の処理しか入りませんよ」という決まりを作ります。 一方、ラムダ式は「実際に実行される処理」をその場で書きます。 つまり、役割がまったく違います。
4. 一緒に使うとどうなるのか?
C#では、デリゲートとラムダ式を組み合わせて使うことがよくあります。 デリゲートという箱を用意し、その中にラムダ式で書いた処理を入れる、という流れです。
MessageDelegate message = () =>
{
Console.WriteLine("デリゲートとラムダ式");
};
message();
この例では、まずデリゲート型の変数を用意し、そこにラムダ式を代入しています。
最後に message() と書くことで、その中身の処理が実行されます。
「箱に入れた処理を呼び出す」と考えるとイメージしやすいでしょう。
デリゲートとラムダ式
5. 初心者が混乱しやすいポイント
プログラミング未経験の方が混乱しやすい理由は、「どちらも処理に見える」からです。 しかし、デリゲート単体では何も動きません。 あくまで「処理を入れるための型」だからです。
一方、ラムダ式は単体では実行されず、デリゲートや別の仕組みに渡して初めて動きます。 この関係を理解すると、「違いがわからない」という状態から一歩抜け出せます。
6. なぜC#で重要なのか?
C#のラムダ式とデリゲートは、後々学ぶコレクション操作やイベント処理で頻繁に登場します。 最初は難しく感じても、「箱と中身」という考え方を覚えておくことで、理解が楽になります。
特にC#では、安全にプログラムを書くために型が重視されます。 デリゲートはその型の役割を担い、ラムダ式は柔軟に処理を書く手段として活躍します。 この組み合わせが、C#らしい書き方の基礎になっています。