เริ่มหัดทำ Events ใน C#

posted on 14 Jun 2008 12:38 by xnanoob  in Tutorials

เช่าห้อง ห้องเช่า อาร์พเม้นต์ apartment 


ดีค่า วันนี้เรามาลองหัดทำ events กันอะค่ะ

โดยจากก่อนหน้านั้นเราดูเรื่อง delegates กันมาแล้ว  โดยในความเข้าใจของหนูนั้น delegates จะมีความสัมพันธ์ที่แนบแน่นกับ events

จากการที่เราบอกว่า delegates เป็นตัวแทนของเรา ทำหน้าที่ในการในการ encapsulate method ทำหน้าที่แทนเรา

เช่นเราเป็นเจ้าของโรงงาน อยากจะให้โรงงานเรามีความปลอดภัยหน่อย โดยจะตรวจสอบคนเข้าคนออกโรงงาน แต่ทำไงได้ คนมีตัง มีงานอย่างอื่นต้องทำ

เอาแบบนี้ดีกว่าไปจ้างยามมาทำหน้าที่แทน ยามก็เปรียบเสมือนตัวแทนของเรา ทำหน้าที่ตรวจสอบคนเข้าออกโรงงาน (delegates)

ต่อมา ยามคนนี้อาจจะมีขบวนการ step หลายอย่างในการทำงาน เช่นหลังจากที่ทำการตรวจสอบคนที่จะขอเข้าโรงงานแล้วอาจต้องทำการบันทึกจดข้อมูลเอาไว้ด้วย

เพราะฉะนั้นมันก็จะคล้ายๆ กับ multicast ที่ส่งไปทำได้หลายๆ อย่าง แต่ delegate ก็ยังคงเป็นได้ชนิดเดียว หมายถึง signature แต่ละ method ก็ต้องเป็น singature เดียวกัน

แต่ในทางปฎิบัติงานหนึ่งๆ ย่อมมีเหตุการณ์เกิดขึ้นได้หลายอย่าง จากตัวอย่างที่เราบอก คือ ยามตรวจสอบ ตรวจสอบเสร็จบันทึก แบ่งเป็นสองขั้นตอน

  • การตรวจสอบ อาจจะใช้ member ID ในการตรวจสอบ
  • ขั้นตอนการบันทึก อาจจะใช้ผลลัพธ์จากการตรวจสอบ ถ้าผลลัพธ์ในการตรวจสอบผ่านให้ทำการบันทึกข้อมูล ถ้าไม่ ให้บันทึกลง log file

Code: (c#)
// สมมติว่า ตรวจสอบคนเข้าโรงงานจาก ID return ผลตรวจสอบเป็น true/false
public bool processcheck(int id) { ...}

// ถ้าผลการตรวจเป็น true ให้เก็บประวัติด้วย ถ้าไม่ให้เก็บลง log ด้วย
public void processsave(bool resultClient){... }

เพราะฉะนั้น method ของทั้งสองตัวจะมี singnature ที่แตกต่างกัน จะมีผลในการจัด multicast ได้ คือจะไม่สามารถใช้ delegate ตัวเดียวกันได้


ใน .NET ก็เลยจะมีการจัดการในส่วนนี้ขึ้นมา  ให้คุณสร้างเป็น events ขึ้นมาได้ เป็นการผูกกิจกรรมหลายๆ แบบต่างๆ กันเข้าไว้ด้วยกันได้

ก็พยายามมองให้มันตรงไปตรงมา เช่น กินข้าว มีกิจกรรมย่อยอะไรบ้าง อ้าปาก ยกช้อน เคี้ยว อะไรแบบเนี้ย (มั่ง)

ดังนั้นตอนที่คุณจะทำ events คุณก็ต้องสร้างให้ขึ้นกับชนิดของ delegates 

Quote
"Declare an Event based on the Delegate"

ตัวอย่างดังนี้

Code: (c#)
//สร้าง delegate และผูก event base on delegate
public delegate bool visitCheck(int ID);
public event visitCheck OnclientEnter;

ตั้งชื่อ type event เป็นชนิด delegate

ลองดูโค้ดแล้วกานนะ

Code:
    class secure {
        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

Code:
class 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 ส่วนนี้
Code:
public void checkClient(int id)
        {
          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

Comment



smilebig smileopen-mounthed smileconfused smilesad smileangry smiletonguequestionembarrassedsurprised smilewinkdouble winkcry

อะโห งง แต่ขอให้สำเร็จนะsad smile

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

ขอบคุณที่แวะไปเจิม Blog ให้นะคะ

เรื่องคอมแป๋วแหววไม่ค่อยรู้เรื่องเท่าไหร่แต่ว่า
อยากจะเก่งเชียวค่ะ

คงต้องเรียนรู้อีกเยอะ

แต่จะพยายามค่ะ

big smile

#2 By Peaw-weaw on 2008-06-14 20:58