Do artigo parcialmente desatualizado, mas ainda útil, do MSDN: " Quando usar delegados em vez de interfaces (guia de programação C #) ", algumas das regras básicas se destacam:
Use um delegado nas seguintes circunstâncias:
(3) The caller has no need to access other properties, methods, or interfaces on the object implementing the method.
Minha explicação:
O chamado (receptor de eventos) pode facilmente se apossar do chamador (remetente) porque pela prática recomendada o chamador passará por si próprio como o primeiro argumento (apropriadamente chamado de sender
) para o chamado.
No entanto, tentar navegar na direção inversa não é trivial. Um delegado pode ser qualquer coisa - um método estático, ou um lambda, ou basicamente qualquer coisa que não seja o objeto real que finalmente processa o evento. Assim, nem sempre é possível determinar qual é esse objeto real.
O último ponto pode ser trabalhado usando padrão de visitante . No entanto, isso adiciona muito código e isso faz com que qualquer discussão seja discutível.
Use uma interface nas seguintes circunstâncias:
(1) There is a group of related methods that may be called.
Eu adicionaria um pouco mais: "... e que esses métodos relacionados são encontrados no mesmo objeto ."
Esta pergunta foi feita muitas vezes. Basta procurar por "C #", "delegate", "interface" para obter muitos resultados. No entanto, leva tempo para examinar os inúmeros conselhos de todas as fontes para filtrar as relevantes, de acordo com sua situação.