連載:[完全版]究極のC#プログラミング

Chapter6 ラムダ式(前編)

川俣 晶
2009/10/19

6.9 C# 2.0と匿名メソッド

 本章「注意を要するキャプチャの本質」の冒頭でも少し名前を出したが、C#には、ラムダ式に似た「匿名メソッド」という機能がある。実質的にラムダ式と機能が重複しており、ラムダ式さえあれば匿名メソッドを使う機会はまずありえない。しかし、匿名メソッドはC# 2.0以降、ラムダ式はC# 3.0以降の実装である関係上、C# 2.0時代のソースコード資産は匿名メソッドを用いて記述している可能性がある。

 そこで、匿名メソッドの書式について簡単に説明しておこう。次のリスト6.15は、「リスト6.1 ラムダ式の記述例」を匿名メソッドに置き換えたものである。

using System;

delegate void MyAction(string message);

class Program
{
  static void Main(string[] args)
  {
    MyAction action = delegate(string message)
    {
      Console.WriteLine(message); // 匿名メソッドの内容
    };
    action("Hello! World!"); // 出力:Hello! World!
  }
}
リスト6.15 匿名メソッドの記述例

 これを見てわかるとおり、局所的な構文の違いがあるだけで、書き方の構造そのものが大幅に変わるわけではない。

 主要な構文の相違を以下に要約した。

(引数リスト)=> { 実行内容 }
ラムダ式

delegate(引数リスト) { 実行内容 }
匿名メソッド

 ただし、匿名メソッドは引数リストの型を省略できない。ラムダ式では「message」とだけ記述された引数が、匿名メソッドでは「string message」とstring型を明示しているのはこのためである。

 もし匿名メソッドを見かけたら、頭の中でdelegateを抜き、引数リストの後ろに=>を補って読めばおおむね問題ないだろう。

【Exercise】練習問題

 次のプログラムに含まれる変数a、b、c、dの寿命に関して正しい説明を選べ。

(なお、変数の寿命と変数に格納されたオブジェクトの寿命は同じではないことに注意。たとえば、メソッドのスコープ内の参照型変数はメソッドを抜けると消滅するが、参照されていたオブジェクトはガベージコレクションで回収されるまでは消滅しないで残存する。)

using System;

class Program
{
  private static Action Sample()
  {
    int a = 0, b = 0;
    string c = "!", d = "{0}";
    return () => { Console.WriteLine(d, b); };
  }
  static void Main(string[] args)
  {
    Action doit = Sample();
    doit();
  }
}
  1. 変数a、b、c、dはすべて、Sampleメソッドの実行を終えた時点で寿命が尽きる
  2. 変数a、b、c、dはすべて、ガベージコレクションで回収されるまで存在し続ける
  3. Sampleメソッドの実行を終えた時点で寿命が尽きるのは変数aだけである
  4. 変数a、bはSampleメソッドの実行を終えた時点で寿命が尽きるが、c、dは尽きない
  5. 変数a、cはSampleメソッドの実行を終えた時点で寿命が尽きるが、b、dは尽きない

 ◎解答:「 5 」(この行をマウスで選択してください)End of Article


 INDEX
  [完全版]究極のC#プログラミング
  Chapter6 ラムダ式(前編)
    1.6.1 おかずでもデザートでもなく“ご飯”
    2.6.2 ラムダ式とは何か?/【C#olumn】定義済みデリゲートを活用しよう
    3.6.3 ラムダ式は上位スコープにアクセスできる
    4.6.4 キャプチャされる変数
    5.6.5 注意を要するキャプチャの本質
    6.6.6 デリゲートの共変性と反変性
    7.6.7 デリゲートインスタンスの等価性
    8.6.8 ラムダ式で継承を置き換えてみる
  9.6.9 C# 2.0と匿名メソッド/【Exercise】練習問題
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間