顧客を検索する関数があるシナリオを想像してみてください。最初は名前で検索したいので、次のように記述します。
public Customer Find(string name)
{
foreach (var customer in database.Customers)
if (customer.Name == name)
return customer;
}
次に、仕様が変更され、新しい検索方法(「アドレスによる検索」など)を実装する必要があります。問題ありません。古いコードを次のようにリファクタリングします。
public Customer FindByName(string name)
{
foreach (var customer in database.Customers)
if (customer.Name == name)
return customer;
}
public Customer FindByAddress(string address)
{
foreach (var customer in database.Customers)
if (customer.Address == address)
return customer;
}
見た目はとても似ていますね。
これで、上司から別の検索機能を追加するように言われました。ユーザーは電話番号で顧客を検索したい場合があります。退屈になりつつありますね。
幸いなことに、開発者は、他の開発者の生活をより簡単に代理人を発明できるようにする方法を見つけました。それらを使用すると、同じコードを何度も書き直さないようにするための、より大きな一般的な関数を1つ作成できます。
public Customer Find(Predicate<Customer> p)
{
foreach (var customer in database.Customers)
if (p(customer))
return customer;
}
これで、顧客を検索する新しい方法が必要になるたびに特殊な関数を作成する必要がなくなるため、次のように記述できます。
var byName = Find(a => a.Name == "lorem");
var byAddress = Find(a => a.Address == "ipsum");
var byTelephone = Find(a => a.Telephone == "dolor");
デリゲートはイベントの管理にも役立ち、LINQでも集中的に使用されます。「デリゲートc#」をグーグルで検索するだけで、巨大な新しい世界を発見できます。:)