То, что вы описываете, по сути является кортежами , сгруппированными значениями, используемыми для определенной цели. Они являются полезной конструкцией в функциональном программировании и очень хорошо поддерживают этот стиль.
Недостатком является то, что их значения не названы, и они требуют понимания контекста. EventArgs
по самой своей природе часто употребляются вдали от соответствующего контекста. Поэтому tuple-esque EventArgs
может быть очень запутанным для потребителя.
Допустим, у нас есть событие, указывающее, что какое-то деление было завершено, и оно содержит числитель, знаменатель и результат:
public event EventHandler<EventArgs<double, double, double>> Divided;
Обработчик событий имеет некоторую двусмысленность:
private void OnDivided(object sender, EventArgs<double, double, double> e)
{
// I have to just "know" this - it is a convention
var numerator = e.Value1;
var denominator = e.Value2;
var result = e.Value3;
}
Это было бы намного яснее, если бы EventArgs
представляло событие:
private void OnDivided(object sender, DividedEventArgs e)
{
var numerator = e.Numerator;
var denominator = e.Denominator;
var result = e.Result;
}
Универсальные многоразовые EventArgs
классы облегчают разработку механизма за счет выражения намерения.