71. Event raise extension method

הכרנו בשבוע שעבר קצת Extension Methods.

אחד הדברים החזקים שראינו זה שאפשר לקרוא למתודות גנריות באמצעות Extension Methods, מה שמאפשר לעתים קריאה נוחה יותר.

אחד השימושים הנחמדים לדבר הזה הוא Extension method להקפצת אירועים. בד”כ כשאנחנו מקפיצים אירועים אנחנו כותבים קוד שדומה לקוד הזה:

1
2
3
4
5
6
7
8
9
public event EventHandler<MyEventArgs> MyEvent;
private void RaiseMyEvent(MyEventArgs eventArgs)
{
if (MyEvent != null)
{
MyEvent(this, eventArgs);
}
}

וקוראים למתודה RaiseMyEvent כל פעם שאנחנו מעוניינים להקפיץ את האירוע.

ניתן במקום זאת ליצור Extension Method כזה:

1
2
3
4
5
6
7
8
9
10
public static void Raise<TEventArgs>(this EventHandler<TEventArgs> eventHandler,
object sender,
TEventArgs args)
where TEventArgs : EventArgs
{
if (eventHandler != null)
{
eventHandler(sender, args);
}
}

ואז להקפיצו בצורה הבאה:

1
MyEvent.Raise(this, args);

שחוסך הרבה מתודות סתמיות שרק נועדו בשביל להקפיץ אירועים.

עוד יותר מזה, אם אנחנו לא נוהגים להקפיץ אירועים כפי שציינתי עכשיו, אלא בדרך יותר מטורפת (למשל עם כל מיני Interlockים וכדומה), נצטרך לכתוב את הקוד של הקפצת האירוע רק פעם אחת 😃

החסרון בשיטה זו, זה שאמנם אנחנו חוסכים מתודות, אך בכל הקפצה של האירוע, אנחנו צריכים לציין את this. זה לא נורא, כי גם ככה היינו רוצים להקפיץ אירוע בשיטה הטבעית הבאה:

1
MyEvent(this, args);

והשיטה שהצגנו מספיק דומה לה 😃

שבוע מורחב טוב

שתף