匿名メソッドとは? [C#]
こんにちは、リバティエンジニア[?]のFUNAです。 現役エンジニアとしてアプリケーション開発やWeb制作、SEOやブログ運営をしています。
今回はC#における、匿名メソッドについてお話します。
C# 2.0 より前のバージョンの時には、デリゲートを宣言する際には、名前付きのメソッドを使用する方法しかありませんでした。
ですが、C# 2.0より、「匿名メソッド」というものが導入されました。
この匿名メソッドではパラメーターリストを省略することができます。
どうゆうことかというと、匿名メソッドをさまざまなシグネチャを持つデリゲートに変換することができるのです。
要は、関数名のない関数が「匿名メソッド」ということになります。
ではどうやって関数名のない関数を呼び出すのでしょうか?
実際にサンプルコードとみていきましょう!
匿名メソッドのサンプルコード
では早速匿名メソッドについてみていくのですが、この匿名メソッドは「デリゲート」が大きく関わってきます。
もし「デリゲート」についてもっと知りたい方はこの記事を参考にしてみてください!
C# 世界一わかるデリゲート(delegate)について
まずは、普通に名前の付いた関数を呼び出すデリゲートを見てみます。
// delegateの宣言
delegate void TestMethodeDelegate();
// テストメソッド
static void TestMethode()
{
Console.WriteLine("これはデリゲートのテスト関数です。");
}
// メイン関数
static void Main(string[] args)
{
// デリゲートを生成する
TestMethodeDelegate func = new TestMethodeDelegateTestMethodeDelegate(TestMethode);
// デリゲートの処理を実行
func();
}
このプログラムの場合だと、デリゲートで呼び出されるメソッドは”TestMethode”という、メソッドに”名前”がついていますよね。
デリゲートでは、メソッドを参照できる型で変数を作ることができますが、
匿名メソッドでは、メソッドの定義をそのままデリゲート変数に代入して、そのデリゲートを呼び出すことで実行することができるんです。
// delegateの宣言
delegate void TestMethodeDelegate();
// メイン関数
static void Main(string[] args)
{
// デリゲートに匿名メソッドを代入する
TestMethodeDelegate func = delegate ()
{
Console.WriteLine("これはデリゲートのテスト関数ですが、このメソッドそのものに名前はありません.");
};
// デリゲートの処理を実行
func();
}
デリゲートを生成して実行し、
「これはデリゲートのテスト関数ですが、このメソッドそのものに名前はありません.」
という文字列が表示されます。
サンプルコードを見るとわかりますが、このメソッドは名前がありません。
(これが「匿名メソッド(無名関数)」と呼ばれるものです)
匿名メソッドの特殊な機能 (外部変数のキャプチャ)
ここまでは、匿名メソッドとはなんなのか?どうやって使うの?という内容を見てきました。
次に、匿名メソッドにある特殊な機能「外部変数のキャプチャ」について説明します。
匿名メソッドを使っているコードを見ると、スコープを抜けて値が保持されていないはずの変数が参照されている。という不思議なコードがあると思います。
スコープ外に出たはずの変数の値がなぜ扱えているかというと、
匿名メソッドが上位スコープの変数を参照しているとき、
その変数の寿命を匿名メソッドの寿命が尽きるまで延命する
という機能によるものなんです。
なので「匿名メソッド(無名関数)」を使うときには、この「外部変数のキャプチャ」に注意して使ってくださいね。