C#ライブラリリファレンス - 手続きをオブジェクトとして扱う
Actionデリゲートを使用すれば、手続き(戻り値を持たないメソッド)をオブジェクトして扱えます。
日常でたとえると
一連の作業をマニュアル化しておく。
使用に適した状況
手続きそのものをオブジェクトして扱いたい場合。初心者の方はピンと来ないと思いますが、プログラミング力が上がると、手続きそのものをオブジェクトとして扱う事の便利さに気が付くようになります。
具体には、実行する手続きを実行時に変えたり、メソッドに渡したりできます。
サンプル
/*----------------------------------------------------
*
* 複数の手続きをオブジェクトとして扱う。
*
----------------------------------------------------*/
using System;
using System.Linq;
using System.Collections.Generic;
class Sample
{
static void Main()
{
//複数の手続きを用意
List<Action> procedures = new List<Action>();
for ( int i = 0 ; i < 10 ; ++i ) {
int number = i;
procedures.Add(
( ) => Console.WriteLine(
"手続き" + number ) );
}
//複数の手続きを実行
Console.WriteLine( "複数の手続きを実行します・・・" );
var actions = from p in procedures
select p;
foreach ( Action f in actions )
f();
//終了
Console.WriteLine( "サンプル終了。" );
Console.ReadLine();
}
}
名前空間
System名前空間を参照します。
解説
戻り値を持たないメソッドを手続き(プロシージャ)と呼びます。通常手続きは、コーディング時にプログラムとして直接書きますが、より抽象的に手続きを扱えた方が、プログラミングでできることが増えます。
オブジェクトとして扱えると、メソッドに渡したり、メソッドから受け取ったり、手続きをリスト化したりできます。その結果、初心者には思いつかないアプリケーションを作ったり、より簡潔で柔軟なプログラムを書くことができるようなったりします。
幸いC#では、デリゲート機能とラムダ式により、簡単に手続きをオブジェクトとして扱えます。ですが、乱用をしてはなりません。覚えたての頃は、とにかく使いたくなりますが、下手に使用するとプログラムの可読性が下がり、意図しない結果になるだけです。
例えば、上記のサンプルでConsole.WriteLine("手続き" + number )をConsole.WriteLine("手続き" + i )に変更してみましょう。すると、全てのメッセージが同じになってしまいます。よく考えて使用しましょう。