Когда вы можете напрямую вызывать метод, вам не нужен делегат.
Делегат полезен, когда код, вызывающий метод, не знает / не заботится о том, что метод, который он вызывает , равен - например, вы можете вызвать длительную задачу и передать ее делегату метод обратного вызова, который задача может использовать для отправки уведомлений о своем состоянии.
Вот (очень глупый) пример кода:
enum TaskStatus
{
Started,
StillProcessing,
Finished
}
delegate void CallbackDelegate(Task t, TaskStatus status);
class Task
{
public void Start(CallbackDelegate callback)
{
callback(this, TaskStatus.Started);
// calculate PI to 1 billion digits
for (...)
{
callback(this, TaskStatus.StillProcessing);
}
callback(this, TaskStatus.Finished);
}
}
class Program
{
static void Main(string[] args)
{
Task t = new Task();
t.Start(new CallbackDelegate(MyCallbackMethod));
}
static void MyCallbackMethod(Task t, TaskStatus status)
{
Console.WriteLine("The task status is {0}", status);
}
}
Как видите, класс Task
не знает и не заботится о том, что - в данном случае - делегат метода, который выводит состояние задачи на консоль. С тем же успехом метод может отправить состояние по сетевому соединению на другой компьютер. Etc.