デリゲート
極端な言い方をすると、C++のコールバックのメカニズム
コールバックメソッドが型の安全性を壊さないことを保証する*
複数のメソッドの同時呼び出しをサポート*
Sample Code
using System;
using System.Windows.Forms;
using System.IO;
class Set
{
private object [] items;
public Set(int numItems) {
items = new object[numItems];
for (int i=0; i<numItems; i++)
items[i] = i;
}
public delegate void Feedback(object value, int item, int numItems);
public void ProcessItems(Feedback feedback) {
for (int item=0; item<items.Length; item++) {
if (feedback != null) {
feedback(items[item], item+1, items.Length);
}
}
}
}
class App
{
static void Main() {
StaticCallbacks();
InstanceCallbacks();
}
static void StaticCallbacks() {
Set setOfItems = new Set(5);
setOfItems.ProcessItems(null);
Console.WriteLine();
setOfItems.ProcessItems(new Set.Feedback(App.FeedbackToConsole));
Console.WriteLine();
setOfItems.ProcessItems(new Set.Feedback(App.FeedbackToMsgBox));
Console.WriteLine();
Set.Feedback fb = null;
fb += new Set.Feedback(App.FeedbackToConsole);
fb += new Set.Feedback(App.FeedbackToMsgBox);
setOfItems.ProcessItems(fb);
Console.WriteLine();
}
static void FeedbackToConsole(object value, int item, int numItems) {
Console.WriteLine("{0} / {1} : {2}", item, numItems, value);
}
static void FeedbackToMsgBox(object value, int item, int numItems) {
MessageBox.Show(string.Format("{0} / {1} : {2}", item, numItems, value));
}
static void InstanceCallbacks() {
Set setOfItems = new Set(5);
App appobj = new App();
setOfItems.ProcessItems(new Set.Feedback(appobj.FeedbackToFile));
Console.WriteLine();
}
void FeedbackToFile(object value, int item, int numItems) {
StreamWriter sw = new StreamWriter("Status", true);
sw.WriteLine("{0} / {1} : {2}", item, numItems, value);
sw.Close();
}
}