Хотя другие ответы пока кажутся разумными, я бы взял более философский подход.
Класс - это механизм , который моделирует определенный тип вещей в определенной области. При написании внутренних деталей класса очень легко сопоставить детали реализации механизма с моделируемой семантикой . Краткий пример того, что я имею в виду:
class Giraffe : Mammal, IDisposable
{
public override void Eat(Food f) { ... }
public void Dispose() { ... }
}
Обратите внимание на то, как мы связали моделируемую реальность (жираф - это вид млекопитающего, жираф ест пищу) с деталями реализации (экземпляр жирафа - это объект, от которого можно избавиться с помощью «использование» заявление). Я гарантирую, что если вы пойдете в зоопарк, вы никогда не увидите жирафа, выбрасываемого с помощью оператора using. Мы перепутали уровни здесь, что вызывает сожаление.
Я пытаюсь использовать события (и свойства) как часть семантической модели и использую методы обратного вызова (и поля) как часть механизма . Я бы сделал GaveBirth событием Giraffe, поскольку это часть модели поведения жирафа в реальном мире, которую мы пытаемся запечатлеть. Если бы у меня был какой-то механизм, например, скажем, я хотел реализовать алгоритм обхода дерева обхода по порядку, который обходил семейное древо жирафов и вызывал метод обратно для каждого, то я бы сказал, что это явно механизм, а не модели, и сделайте это обратным вызовом, а не пытайтесь вставить это в модель события.