Events
Event คือเหตุการณ์ที่เกิดขึ้นในขณะที่โปรแกรมทำงาน เพื่อทำบางอย่างในโปรแกรม เช่น การกดปุ่ม หรือการทำงานของนาฬิกา การ interrupt จากอินพุตเอาท์พุตภายนอก
ในการจัดการกับ event ที่เกิดขึ้นในภาษา C# เราต้องสร้างเมธอดสำหรับการ Callback ซึ่งเป็นเมธอดที่จะทำงานเมื่อเกิด event ขึ้น โดยทั่วไปเมธอดนี้จะมีสองพารามิเตอร์คือ แหล่งกำเนิดของ event และอากิวเมนต์ของ event
ในการสร้างเมธอดสำหรับ Callback และเรียกใช้ event นั้นจะเกี่ยวข้องกับ delegate โดยตรง ดังนั้นในบทนี้คุณต้องเข้าใจเกี่ยวกับ delegate ให้ดีก่อน
การสร้าง Event
ต่อไปมาดูตัวอย่างการสร้าง event อย่างง่ายในภาษา C# โดยโปรแกรมของเราจะเป็น event เกี่ยวกับการบอกสภาพอากาศ โดยเราจะทำการ trigger event (การทำให้เกิด event ขึ้น)
using System;
public delegate void OnBadWeatherHandler(object sender, EventArgs e);
class EventExample
{
static void Main(string[] args)
{
string[] weathers = { "Sunny", "Cloudy", "Rainy", "Snow" };
BWEvent bwe = new BWEvent();
bwe.BadWeatherEvent += new OnBadWeatherHandler(Callback);
Random random = new Random();
Console.WriteLine("Weather forecast this week");
for (int i = 1; i <= 7; i++)
{
int rd = random.Next(weathers.Length);
Console.WriteLine("Day " + i);
if (weathers[rd] == "Rainy" || weathers[rd] == "Snow")
{
bwe.OnBadWeatherEvent();
}
}
}
public static void Callback(object sender, EventArgs e)
{
Console.WriteLine("Bad weather Event occured");
}
}
class BWEvent
{
public event OnBadWeatherHandler BadWeatherEvent;
public void OnBadWeatherEvent()
{
if (BadWeatherEvent != null)
BadWeatherEvent(this, EventArgs.Empty);
}
}
ในตัวอย่างเราได้สร้าง event สำหรับการพยากรณ์อากาศในแต่ละวันขึ้นมา และถ้าวันไหนสภาพอากาศไม่ดี โปรแกรมจะแสดงผลว่า "Bad weather Event occurred"
public delegate void OnBadWeatherHandler(object sender, EventArgs e);
...
public event OnBadWeatherHandler BadWeatherEvent;
เราได้สร้าง delegate สำหรับการจัดการกับ event ซึ่งมีพารามิเตอร์สองตัว คือ object sender
เป็นออบเจ็คของอีเวนต์ และ EventArgs e
เป็นอากิวเมนต์ของอีเวนต์ และต่อมาเรานำมาสร้าง event ในคลาส BWEvent ด้วยคำสั่ง event
BWEvent bwe = new BWEvent();
bwe.BadWeatherEvent += new OnBadWeatherHandler(Callback);
ต่อมาเราได้สร้างและกำหนด event BadWeatherEvent
ให้กับเมธอด Callback()
นั่นหมายความว่า เมื่อ event นี้ถูก trigger เมธอด Callback() ก็จะทำงาน
if (weathers[rd] == "Rainy" || weathers[rd] == "Snow")
{
bwe.OnBadWeatherEvent();
}
ในส่วนนี้เป็นการตรวจสอบเงื่อนไขในการ trigger event โดยเราได้สุ่มสภาพอากาศในแต่ละวัน ถ้าวันไหนอากาศแย่จะทำให้เกิด event ขึ้น และโปรแกรมจะทำงานในเมธอด Callback()
Weather forecast this week
Day 1
Day 2
Day 3
Bad weather Event occurred
Day 4
Day 5
Bad weather Event occurred
Day 6
Bad weather Event occurred
Day 7
นี่เป็นผลลัพธ์ของโปรแกรมโดย event เกิดขึ้นในวันที่ 3 5 และ 6 ของสัปดาห์ที่เกิดจากการสุ่ม ซึ่งผลรันของคุณอาจแตกต่างกัน
Event with arguments
ในภาษา C# โดยปกติการเกิด event ขึ้นนั้นจะมีการส่งอากิวเมนต์ไปยังเมธอด Callback() เพื่อนำข้อมูลนั้นไปใช้งาน ในตัวอย่างต่อไปเราจะสร้าง event และส่งอากิวเมนต์ไปยังเมธอดดังกล่าว
using System;
public delegate void OnBadWeatherHandler(object sender, BadWeatherArguments e);
public class EventExample
{
static void Main(string[] args)
{
string[] weathers = { "Sunny", "Cloudy", "Rainy", "Snow" };
int[] avgTemp = { 24, 18, 12, 0 };
BWEvent bwe = new BWEvent();
bwe.BadWeatherEvent += new OnBadWeatherHandler(Callback);
Random random = new Random();
Console.WriteLine("Weather forecast this week");
for (int i = 1; i <= 7; i++)
{
int rd = random.Next(weathers.Length);
Console.WriteLine("Day " + i);
if (weathers[rd] == "Rainy" || weathers[rd] == "Snow")
{
BadWeatherArguments myArgs = new BadWeatherArguments();
myArgs.weather = weathers[rd];
myArgs.highTemp = avgTemp[rd] + random.Next (5);
bwe.OnBadWeatherEvent(myArgs);
}
}
}
public static void Callback(object sender, BadWeatherArguments e)
{
Console.WriteLine(e.weather + " weather Event occurred, high is "+ e.highTemp + " celcius");
}
}
public class BWEvent
{
public event OnBadWeatherHandler BadWeatherEvent;
public void OnBadWeatherEvent(BadWeatherArguments e)
{
BadWeatherEvent(this, e);
}
}
public class BadWeatherArguments : EventArgs
{
public string weather;
public int highTemp;
}
ข้างบนเป็นโปรแกรมที่เราได้สร้าง event จากตัวอย่างก่อนหน้า และสำหรับตัวอย่างนี้เราได้เพิ่มการส่งอากิวเมนต์สำหรับ event เราได้แก้ไขและเพิ่มเติมโค้ดบ้างส่วน
public delegate void OnBadWeatherHandler(object sender, BadWeatherArguments e);
...
public class BadWeatherArguments : EventArgs
{
public string weather;
public int highTemp;
}
เราได้สร้างคลาส BadWeatherArguments
ที่สืบทอดมาจากคลาส EventArgs
เพื่อที่จะใช้ในการสร้างอากิวเมนต์สำหรับ event และเราได้ปรับปรุงพารามิเตอร์ใน delegate เพื่อให้ตรงกันกับอากิวเมนต์ที่จะส่งเข้าไป
BadWeatherArguments myArgs = new BadWeatherArguments();
myArgs.weather = weathers[rd];
myArgs.highTemp = avgTemp[rd] + random.Next (5);
bwe.OnBadWeatherEvent(myArgs);
เราได้สร้างออบเจ็คของอากิวเมนต์ที่จะส่งไปยัง Callback() เมธอด โดยเก็บค่าสภาพอากาศและอุณหภูมิสูงสุดที่เกิดจากการสุ่มค่า เพื่อนำไปแสดงผลข้างใน
public static void Callback(object sender, BadWeatherArguments e)
{
Console.WriteLine(e.weather + " weather Event occurred, high is "+ e.highTemp + " Celsius");
}
ใน Callback() เมธอด เรานำค่าจากอากิวเมนต์มาแสดงผลสำหรับ event ที่เกิดขึ้น โดย object sender
เป็นออบเจ็คของ Event นี้ ซึ่งก็คือคลาส BWEvent และ BadWeatherArguments e
เป็นออบเจ็คอากิวเมนต์ที่เราสร้างเพื่อส่งค่าเข้ามายังเมธอดนี้
Weather forecast this week
Day 1
Rainy weather Event occurred, high is 15 Celsius
Day 2
Rainy weather Event occurred, high is 14 Celsius
Day 3
Day 4
Snow weather Event occurred, high is 0 Celsius
Day 5
Day 6
Day 7
Snow weather Event occurred, high is 3 Celsius
นี่เป็นผลลัพธ์ของโปรแกรมซึ่งอาจจะแตกต่างกัน
ในปกติแล้ว event ที่เกิดขึ้นนั้นจะเป็นอิสระต่อกัน เช่น เมื่อเกิด event ขึ้น Callback() เมธอดจึงจะทำงาน ตัวอย่างของ event ที่เกิดขึ้นในการเขียนโปรแกรมภาษา C# แบบ GUI เช่น การกดปุ่ม การคลิกเมาส์ การลากเมาส์ ซึ่งแต่ละ event จะมีเมธอดในการจัดการที่แตกต่างกันไป นอกจากนี้ Event ยังถูกใช้ในการพัฒนาเกม เช่น การชนกันของวัตถุ การเกิดของศัตรู เหล่านี้ถือว่าเป็น event
ในบทนี้ คุณได้รู้จักกับ event ในภาษา C# การสร้าง event และการทำให้ event สามารถทำงานได้ รวมทั้งการส่งอากิวเมนต์เพื่อเข้าไปใช้งานใน Callback() เมธอด ซึ่งเป็นพื้นฐานในการทำไปพัฒนาโปรแกรมในรูปแบบ event-driven programming