デリゲートは非常に強力な言語機能のように見えますが、私はまだそれらを怒って使用する機会を見つけていません (私が言わなければならない DAL を除いて)。
それらをどのくらいの頻度で使用しますか? また、どのような状況で最も役立つと思いますか?
ほとんどの場合、イベントで C# デリゲートを使用します。
public delegate void MyDelegate(object sender, EventArgs e, string otherParameterIWant);
//...Inside the class
public event MyDelegate myEvent;
//...Inside a method
if (myEvent != null)
myEvent(this, new EventArgs(), "Test for SO");
イベント ハンドラー、コールバック、および述語にそれらを使用して、いくつか例を挙げます。C++ でプログラミングしたことがあれば、それらを関数ポインターと考えることができ、その用途のいくつかはすぐに明らかになると思います。
定型コードの途中で何かを変更する必要がある場合は、デリゲートが特に気に入っています。
public delegate bool ItemFilterDelegate(MyItem item);
public IEnumerable<MyItem> FilterItems(ItemFilterDelegate filter)
{
var result = new List<MyItem>();
foreach(MyItem item in AllItems)
{
if(filter(item))
result.Add(item);
}
return item;
}
public IEnumerable<MyItem> FilterByName(string name)
{
return FilterItems(item => item.Name == name);
}
これらは、LINQ でもこのように頻繁に使用されます。
Funcs と Actions はデリゲートの新しい「タイプ」であり、Linq やその他の奇妙な状況でよく使用します。個人的には、ラムダ式よりもわかりやすい名前を付けたいので、Linq の場合は便利です。
someList.Select(item => item.Name);
Func を使用すると、次のことができます。
Func<Item, String> itemName = item => item.Name;
...
someList.Select(itemName);
もっと一行かもしれませんが、クラスで特定のラムダ式を数回繰り返していることに気付くことがあるので、個人的には Funcs がうまく機能していると思います。
もう 1 つの状況は、より適切な用語がないため、メソッド ファクトリです。基本的には、アクションのリストを値として保持し、列挙型をキーとして保持する辞書です。
Dictionary<UserType, Action<User>> showControls;
showControls = new Dictionary<UserType, Action<User>>();
showControls.Add(SomeEnum.Admin, setControlsForAdmin);
showControls.Add(SomeEnum.Normal, setControlsForNormalUser);
showControls.Add(SomeEnum.Unregistered, setControlsForUnregisteredUser);
そして、メソッド自体をページの別の場所に書き出します。そして使用は次のようになります:
showControls[user.UserType]();
または、メソッド自体を別のメソッドに渡したい場合:
Action<User> neededMethod;
neededMethod = showControls[user.UserType];
SomeMethod(neededMethod);
デリゲートにはもっと良い使い方があると思いますが、これらは便利です。
イベント、述語検索、場合によってはインライン機能..それらは多くのシナリオで役立ちます..
List.ForEach(デリゲート...)
C#3 でラムダ式が追加されたことで、面倒な部分が隠され、非常に使いやすくなりました。
myList.Sort(a=> a.LastName);
コールバックに最もよく使用します。コールバック メソッドのオブジェクト (インターフェイスを使用) の代わりに、メソッドをデリゲートでラップして渡すことができます。
Daok がイベントについて言うように、私は常にそれらを使用していましたが、ほとんどの一般的なイベント (少なくとも私が行っていることでは一般的) に組み込みハンドラーを使用できることを知りました。今では通常、API インタラクションのコールバック ハンドラとして使用しています。