מדריך #C מתקדם – אירועים – Events
event – הודעה שאובייקט שולח לאובייקטים אחרים.
event הינו למעשה מקרה פרטי של delegate. הרעיון של event הינו להצביע על פונקציה והוא מספק מספר הגבלות אשר לא קיימות ב- delegate רגיל:
- ניתן להגדיר event רק כחבר מחלקה (member) ולא ניתן בתוך פונקציה או כפרמטר לפונקציה
- ניתן להפעיל event רק באותה מחלקה בה הוא נכתב
- ניתן להוסיף ולהוריד פונקציות מ- event באמצעות =+, =- (כמו multicast delegate), אך לא ניתן לדרוס את מה שיש שם באמצעות =
הגבלות אלו מספקות ביטחון גבוה יותר, אשר מונע טעויות כמו דרישה של הפונקציות אליהם מצביע ה- event, ולכן אם לא נצטרך משהו שסותר הגדרות אלו (כגון פרמטר לפונקציה), נעדיף להשתמש ב- event.
בכדי להגדיר event צריך תחילה להגדיר delegate, לדוגמא:
public delegate void SpeedDelegate(int newSpeed);
לאחר מכן יש להגדיר משתנה מסוג ה- delegate בצרוף המילה השמורה event:
public event SpeedDelegate SpeedChanged;
רישום פונקציה ל- event (הצבעה) והפעלת ה- event הינם בדיוק כמו ב- delegate (למעט ההגבלה של =).
להלן דוגמא שמיד ננתח:
public delegate void SpeedDelegate(int newSpeed);
class Car
{
public event SpeedDelegate SpeedChanged;
private int speed;
public int Speed
{
get { return speed; }
}
public void AddSpeed(int delta)
{
speed += delta;
if (SpeedChanged != null)
SpeedChanged(speed);
}
}
class Program
{
static void Main(string[] args)
{
Car c = new Car();
//רישום הפונקציה לאירוע
c.SpeedChanged += new SpeedDelegate(PrintSpeed);
c.AddSpeed(16);
c.AddSpeed(28);
c.AddSpeed(52);
c.AddSpeed(-10);
c.AddSpeed(14);
}
static void PrintSpeed(int newSpeed)
{
Console.WriteLine(newSpeed);
}
}
בדוגמא זו ישנה מחלקה בשם Car המאפשרת שינוי מהירות הרכב. למחלקה event בשם SpeedChanged אשר מודיע כאשר השתנתה מהירות הרכב. בתוכנית רשמנו את הפונקציה PrintSpeed ל- event ובכל פעם שנוסיף מהירות (5 פעמים במקרה שלנו) ה- event יפעיל את הפונקציה הזו שמדפיסה את המהירות החדשה.
פלט התוכנית:
השימוש באירועים נפוץ ב- .NET בעיקר בסביבות עשירות ב- GUI, למשל, WinForms, WPF, ASP.NET וכו'. השימוש באירועים בסביבות אלו מאפשר, למשל, להפעיל פונקציות המתבצעות כתוצאה מפעולה של המשתמש. לדוגמא, אירוע של לחיצה על כפתור יגרור תגובה בצורה של פונקציה המסוגלת לבצע אוסף של פעולות.
public partial class MyForm : Form
{
Button myButton;
public MyForm()
{
InitializeComponent();
//הרישום לאירוע
myButton.Click += new EventHandler(myButton_Click);
}
//הפונקציה המתבצעת כתוצאה מהפעלת האירוע
private void myButton_Click(object sender, EventArgs e)
{
MessageBox.Show("Test");
}
}
אנחנו לא יכולים לדעת מראש (וגם לא גם צריכים לדעת) האם המשתמש יחלץ על הכפתור, ואם כן, מתי זה יקרה וכמה פעמים. אבל בטוח שבכל פעם שהמשתמש יחלץ על הכפתור האירוע Click יתעורר ויפעיל את הפונקציה או הפונקציות שנרשמו אליו מראש.
תגובות בפייסבוק