Events & Delegates

Events là gì?

  • Thông báo 1 sự kiện/ hành động xảy ra
  • Thông báo cho nhiều người đăng kí (pub-sub) 
  • Những subscribers này không biết đến nhau

Events

Event Handler

  • Nhận và xử lý dữ liệu của sự kiện từ delegates
  • Nhận 2 tham số: sender & EventArgs

Delegates

  • Đường dẫn nối giữa bên phát sự kiện và bên lắng nghe rồi xử lý sự kiện
  • Giúp truyền dữ liệu của sự kiện hay chính là EventArgs
  • Xây dựng trên lớp cha (base class) là MulticastDelegate

Tạo Delegates

  • Delegate như 1 biến tham chiếu đến phương thức khác
  • Giúp truyền phương thức như 1 tham số của phương thức khác - giống callback function
  • Khởi tạo với từ khóa delegate 
        class Program
        {
            // khai báo 1 delegate
            public delegate int Calculate (int a, int b);
                        
        }

Tạo Delegates

        class Program
        {
            // kháo báo 1 delegate
            public delegate int Calculate (int a, int b);
        
            static void Main(string[] args)
            {
                // delegate Calculate tham chiếu hay trỏ đến phương thức Add
                Calculate calculateDel = Add;
                  
                calculateDel(10, 4); // 14
        
                // delegate Calculate tham chiếu hay trỏ đến phương thức Subtract
                calculateDel = Subtract;
        
                Console.WriteLine(calculateDel.Invoke(10, 4)); // 6
            }
        
            // khai báo 2 phương thức Add, Subtract 
            // có cùng kiểu (method signature) với delegate
            public static int Add (int a, int b)
            {
                return a + b;
            }
        
            public static int Subtract (int a, int b)
            {
                return a - b;
            }
        }

Truyền delegate như tham số

    class Program {
        // kháo báo 1 delegate
        public delegate int Calculate (int a, int b);

        static void Main (string[] args) {
            // delegate Calculate tham chiếu hay trỏ đến phương thức Add
            Calculate calculateDel = Add;
            Console.WriteLine (calculateDel (10, 4)); // 14

            // delegate Calculate tham chiếu hay trỏ đến phương thức Subtract
            calculateDel = Subtract;
            Console.WriteLine (calculateDel (10, 4)); // 6

            // truyền phương thức là tham số đầu vào
            CalculateHelper (Add, 10, 4);
        }

        // Tạo 1 phương thức nhận delegate là tham số đầu vào
        public static void CalculateHelper (Calculate del, int a, int b) {
            Console.WriteLine (del (a, b));
        }

        // khai báo 2 phương thức Add, Subtract 
        // có cùng kiểu (method signature) với delegate
        public static int Add (int a, int b) {
            return a + b;
        }

        public static int Subtract (int a, int b) {
            return a - b;
        }
    }

Multicast Delegates 

    class Program {
        // kháo báo 1 delegate
        public delegate int Calculate (int a, int b);

        static void Main (string[] args) {
            // Multicast - viết đè lên kết quả của các delegates trước
            // Console.WriteLine(calculateDel2(9, 10)); // chỉ -1 đc in ra

            // Để xem tất cả kết quả 
            Console.WriteLine("Multicast del: ");
            foreach (Calculate del in calculateDel2.GetInvocationList())
            {
                Console.WriteLine(del(9, 10));
            }
        }

        // Tạo 1 phương thức nhận delegate là tham số đầu vào
        public static void CalculateHelper (Calculate del, int a, int b) {
            Console.WriteLine (del (a, b));
        }

        // khai báo 2 phương thức Add, Subtract 
        // có cùng kiểu (method signature) với delegate
        public static int Add (int a, int b) {
            return a + b;
        }

        public static int Subtract (int a, int b) {
            return a - b;
        }
    }

Tạo Events

  • Event là delegate được đóng gói - khi gọi event thì cũng là gọi delegate
  • Khởi tạo với từ khóa event
  • Delegate của 1 event thường có 2 tham số: đối tượng phát sự kiện (object sender) và dữ liệu sự kiện (EventArgs e) 
        class Program
        {
            
            // khai báo 1 delegate
           

            // thường khai báo event ngay sau delegate nó sẽ dùng
            
                        
        }

Delegates & Events

By Linh Ngo

Delegates & Events

Delegates & events in C#

  • 191