206. Solving the problem with events - part 5

פעם שעברה ראינו כיצד ניתן לגרום לWeak event להסיר את עצמו מEvent ברגע שהEvent קופץ והTarget של הDelegate מת.

אמרתי שאפשר לעשות את הסינטקס קצת יותר יפה.

ובכן, אם מדובר בEvent שלנו, אפשר לדאוג לכך שכל ההרשמות אליו יהיו Weak.

איך אפשר לעשות זאת? בעזרת הAccessorים של AddוRemove. (ראו גם טיפ מספר 194)

למשל, משהו כזה:

1
2
3
4
5
6
7
8
9
10
11
12
13
private event EventHandler<EventArgs> mEventRaised;
public event EventHandler<EventArgs> EventRaised
{
add
{
mEventRaised += value.MakeWeak(x => mEventRaised -= x);
}
remove
{
// TODO: Write removal code here.
}
}

כמה הסברים:

כשנרשמים לEvent שלנו אנחנו בעצם נרשמים לMember שלנו עם Weak Event מתאים בעזרת הExtension Method שרשמנו פעם שעברה. (טיפ מספר 205)

למה אנחנו מחזיקים במחלקה event שהוא private ולא סתם Delegate? הסיבה העיקרית היא שראינו שEventים ממומשים בצורה קצת שונה ממימוש סטנדרטי, במיוחד בFramework 4.0 (טיפ מספר 195).

אז השתמשנו בprivate event בשביל לקבל את היכולות האלה.

באשר לRemove, כרגע אין שם קוד שמסיר את ההרשמה לEvent. זה דבר קצת פחות טריוואלי לכתוב כי המתודה שאליה מצביע הWeak Event שונה מהמתודה שאליה מצביע הEvent שאנחנו מקבלים (הvalue).

נראה פעם הבאה את המימוש לAccesor זה.

שבוע בעל אירועים חסרי דליפות טוב

שתף