เริ่มหัดทำ Events ใน C#
posted on 14 Jun 2008 12:38 by xnanoob in Tutorials
ดีค่า วันนี้เรามาลองหัดทำ events กันอะค่ะ
โดยจากก่อนหน้านั้นเราดูเรื่อง delegates กันมาแล้ว โดยในความเข้าใจของหนูนั้น delegates จะมีความสัมพันธ์ที่แนบแน่นกับ events
จากการที่เราบอกว่า delegates เป็นตัวแทนของเรา ทำหน้าที่ในการในการ encapsulate method ทำหน้าที่แทนเรา
เช่นเราเป็นเจ้าของโรงงาน อยากจะให้โรงงานเรามีความปลอดภัยหน่อย โดยจะตรวจสอบคนเข้าคนออกโรงงาน แต่ทำไงได้ คนมีตัง มีงานอย่างอื่นต้องทำ
เอาแบบนี้ดีกว่าไปจ้างยามมาทำหน้าที่แทน ยามก็เปรียบเสมือนตัวแทนของเรา ทำหน้าที่ตรวจสอบคนเข้าออกโรงงาน (delegates)
ต่อมา ยามคนนี้อาจจะมีขบวนการ step หลายอย่างในการทำงาน เช่นหลังจากที่ทำการตรวจสอบคนที่จะขอเข้าโรงงานแล้วอาจต้องทำการบันทึกจดข้อมูลเอาไว้ด้วย
เพราะฉะนั้นมันก็จะคล้ายๆ กับ multicast ที่ส่งไปทำได้หลายๆ อย่าง แต่ delegate ก็ยังคงเป็นได้ชนิดเดียว หมายถึง signature แต่ละ method ก็ต้องเป็น singature เดียวกัน
แต่ในทางปฎิบัติงานหนึ่งๆ ย่อมมีเหตุการณ์เกิดขึ้นได้หลายอย่าง จากตัวอย่างที่เราบอก คือ ยามตรวจสอบ ตรวจสอบเสร็จบันทึก แบ่งเป็นสองขั้นตอน
- การตรวจสอบ อาจจะใช้ member ID ในการตรวจสอบ
- ขั้นตอนการบันทึก อาจจะใช้ผลลัพธ์จากการตรวจสอบ ถ้าผลลัพธ์ในการตรวจสอบผ่านให้ทำการบันทึกข้อมูล ถ้าไม่ ให้บันทึกลง log file
public bool processcheck(int id) { ...}
// ถ้าผลการตรวจเป็น true ให้เก็บประวัติด้วย ถ้าไม่ให้เก็บลง log ด้วย
public void processsave(bool resultClient){... }
เพราะฉะนั้น method ของทั้งสองตัวจะมี singnature ที่แตกต่างกัน จะมีผลในการจัด multicast ได้ คือจะไม่สามารถใช้ delegate ตัวเดียวกันได้
ใน .NET ก็เลยจะมีการจัดการในส่วนนี้ขึ้นมา ให้คุณสร้างเป็น events ขึ้นมาได้ เป็นการผูกกิจกรรมหลายๆ แบบต่างๆ กันเข้าไว้ด้วยกันได้
ก็พยายามมองให้มันตรงไปตรงมา เช่น กินข้าว มีกิจกรรมย่อยอะไรบ้าง อ้าปาก ยกช้อน เคี้ยว อะไรแบบเนี้ย (มั่ง)
ดังนั้นตอนที่คุณจะทำ events คุณก็ต้องสร้างให้ขึ้นกับชนิดของ delegates
ตัวอย่างดังนี้
public delegate bool visitCheck(int ID);
public event visitCheck OnclientEnter;
ตั้งชื่อ type event เป็นชนิด delegate
ลองดูโค้ดแล้วกานนะ
public bool state;
// สมมติว่า ถ้า ID คนเข้าโรงงานต้องเป็นเลขคู่ถึงจะเข้าได้
public bool processcheck(int id) {
if (id % 2 == 0) {
this.state = true;
return true;
}else{
this.state = false;
return false;
}
}
// ถ้าผลการตรวจเป็น true ให้เก็บประวัติด้วย ถ้าไม่ให้เก็บลง log ด้วย
public void processsave(bool resultClient){
if (resultClient){
Console.WriteLine("save data");
} else {
Console.WriteLine("save log");
}
}
//สร้าง delegate และผูก event base on delegate
public delegate bool visitCheck(int ID);
public event visitCheck OnclientEnter;
//สร้าง delegate และผูก event base on delegate
public delegate void saveHist(bool ID);
public event saveHist OnsaveData;
// method ตรวจสอบคนเข้าโรงงาน
public void checkClient(int id)
{
OnclientEnter(id);
OnsaveData(this.state);
// แตกต่างกันยังไง
// bool result2 = processcheck(id);
// processsave(result2);
}
}
ส่วน main program
{
static void Main(string[] args)
{
secure o = new secure();
//ผูก event เข้ากับ object ยาม
o.OnclientEnter += new secure.visitCheck(o.processcheck);
o.OnsaveData += new secure.saveHist(o.processsave);
o.checkClient(16);
Console.ReadLine();
}
}
สุดท้าย ให้พิจารณาใน code ส่วนนี้
{
OnclientEnter(id);
OnsaveData(this.state);
// แตกต่างกันยังไง
// bool result2 = processcheck(id);
// processsave(result2);
}
| bool result2 = processcheck(id); processsave(result2); |
| OnclientEnter(id); OnsaveData(this.state); |
การทำงานจะให้ผลลัพธ์ที่เหมือนกัน แต่สิ่งที่ทำไปนี้ ทำไปทำไม?
ปล.ก็ยังไม่ค่อยเข้าใจเท่าไหร่ เดี๋ยวขอตัวไปมั่วก่อนนะค่ะ
จบแระค่า บายค่ะ งุงิ งุงิ
เอกสารอ้างอิง Delegates and Events in C# / .NET
ปล.2 ดูแบบสีได้ที่ http://www.xnanoob.com/forum/index.php?topic=19.0









#1 By Pe@ & KeE on 2008-06-14 12:51