|
|
連載:[完全版]究極の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 匿名メソッドの記述例 |
これを見てわかるとおり、局所的な構文の違いがあるだけで、書き方の構造そのものが大幅に変わるわけではない。
主要な構文の相違を以下に要約した。
ただし、匿名メソッドは引数リストの型を省略できない。ラムダ式では「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();
}
}
|
|
- 変数a、b、c、dはすべて、Sampleメソッドの実行を終えた時点で寿命が尽きる
- 変数a、b、c、dはすべて、ガベージコレクションで回収されるまで存在し続ける
- Sampleメソッドの実行を終えた時点で寿命が尽きるのは変数aだけである
- 変数a、bはSampleメソッドの実行を終えた時点で寿命が尽きるが、c、dは尽きない
- 変数a、cはSampleメソッドの実行を終えた時点で寿命が尽きるが、b、dは尽きない
◎解答:「 5 」(この行をマウスで選択してください)
Insider.NET 記事ランキング
本日
月間