Я пытаюсь правильно понять Events
и EventArgs
, но не могу получить ручку в целом EventArgs.Empty
.Выполнение EventArgs Пустой Правильно
EventArgs
инвентарь:
public static readonly EventArgs Empty;
и позволяет создать EventHandler
и вызвать его с помощью:
public event EventHandler<EventArgs> TestHappening;
private void MyMethod()
{
TestHappening(this, EventArgs.Empty);
}
Теперь я изучил ряд классов, основанных на EventArgs
и ни один из них не кажется, чтобы реализовать это, поэтому я лечу немного вслепую, хотя я прочитал всю документацию, которую я смог найти относительно EventArgs.Empty
. Согласно документации, «Значение Empty является экземпляром EventArg, доступным только для чтения, эквивалентным результату вызова конструктора EventArgs».
Основываясь на том, что я создал следующую реализацию:
public class TestEventArgs : EventArgs
{
public static readonly TestEventArgs Empty;
public bool UpdatedValue { get; private set; }
TestEventArgs()
: this(false)
{
}
public TestEventArgs(bool updatedValue)
{
this.UpdatedValue = updatedValue;
}
}
public event EventHandler<TestEventArgs> TestHappening;
private void MyMethod()
{
TestHappening(this, EventArgs.Empty);
}
является использование TestEventArgs.Empty
Instancing класс или что именно он делает?
Кроме того, несмотря на то, что все подклассы, которые я проверил, не использовали Empty
, они все еще имеют его доступными, разве это не запутывает наличие непригодного для использования свойства?
Наконец, на основе различных документов, которые я изучал, было два основных отклонения от того, когда фактически создавать экземпляр EventArgs
. Что считается «более» правильный ?:
OnTestHappening(new TestEventArgs(false));
private void OnTestHappening(TestEventArgs e)
{
var handler = TestHappening;
if (handler != null)
handler(this, e);
}
против
OnTestHappening(true);
private void OnTestHappening(bool foo)
{
var handler = TestHappening;
if (handler != null)
handler(this, new TestEventArgs(foo));
}
Класс EventArgs предназначен для базового класса. Для более специализированных классов событий, которые действительно имеют полезные свойства. Вы не знаете, когда вы когда-нибудь захотите этого класса. Итак, вы начинаете с EventArgs и можете очень легко изменить его, не нарушая никаких обработчиков событий. Пока не наступит этот день, вам нужно передать экземпляр EventArgs. Вы можете использовать 'new EventArgs()', но это бесполезно, EventArgs.Empty - дешевая альтернатива. –
Даже не имеет смысла иметь «пустой» экземпляр этого класса в первую очередь. Когда вы создаете этот класс, вы должны ожидать, что люди будут фактически создавать логическое значение при создании экземпляра, а не использовать значение по умолчанию. – Servy
@Servy: Я согласен, я просто пытаюсь полностью понять, как это работает и понял, если я сломал его, как я, это может помочь какой-то другой потерянной душе однажды :) – Storm