EVENTOS E DELEGATES
Pensado eu ser este um assunto muito discutido nos fóruns de desenvolvimento de software, resolvi demonstrar um exemplo simples e prático aqui no blog.
Observação: quem não conhece o termo DDD - Domain Driven Design, aconselho o livro (http://books.google.com.br/books?id=7dlaMs0SECsC&printsec=frontcover&redir_esc=y#v=onepage&q&f=false) do Eric Evans.
Imagine a seguinte situação: sua aplicação possui uma camada de apresentação (Windows Forms ou Asp.Net) que utiliza classes que estão localizadas em uma Class Library que faz parte da camada de Domínio (onde residem as entidades, repositórios, fábricas, etc). Uma dessa classes possui propriedades que, dada a ocorrência de alguns comportamentos, são alteradas e sua aplicação precisa ser notificada de tais alterações para exibir os resultados ao usuário. Não seria uma prática ideal adicionar o namespace System.Windows.Forms na referida classe para utilizar a classe MessageBox, já que não deve-se utilizar de tecnologias na camada de Domínio. Injetar referências para métodos que exibe telas da apresentação através de delegates também não é lá das melhores práticas.