Event với Delegate trong C#

Khóa học lập trình C# nâng cao

5.0 (4 đánh giá)
Tạo bởi HowKteam Cập nhật lần cuối 23:32 26-07-2020 29.154 lượt xem 3 bình luận
Tác giả/Dịch giả: HowKteam
Học nhanh

Danh sách bài học

Event với Delegate trong C#

Dẫn nhập

Ở các bài học trước, chúng ta đã cùng nhau tìm hiểu về DELEGATE TRONG C#. Hôm nay chúng ta sẽ cùng tìm hiểu về Event trong C#.


Nội dung

Để đọc hiểu bài này tốt nhất các bạn nên có kiến thức cơ bản về các phần:

Trong bài học này, chúng ta sẽ cùng tìm hiểu các vấn đề:

  • Event là gì?
  • Khai báo Event trong C#
  • Khởi tạo Event trong C#
  • Cách dùng Event trong C#

Event là gì?

Event Delegate với mục đích để cho lớp khác hoặc đối tượng cha của đối tượng hiện tại ủy thác(định nghĩa) hàm vào trong đó.

Mục đích chính của chuyện này là để thông báo lên cho đối tượng cha biết mà xử lý.


Khai báo Event trong C#

Khai báo Event trong C# sẽ tương tự như khai báo một biến. Nhưng biến này sẽ nhận kiểu dữ liệu là Delegate đã được tạo trước đó. Cần có từ khóa event để chương trình biết đây là một biến event.

Công thức:

event <Kiểu delegate> <tên event>;

Ví dụ:

event UpdateNameHandler NameChanged;

Ví dụ code đầy đủ:

namespace Event_Voi_Delegate
{
    		public delegate void UpdateNameHandler(string name);
    		class Program
    		{
        		static void Main(string[] args)
        		{
        		}
    		}

    		public class HocSinh
    		{
        		public event UpdateNameHandler NameChanged;

        		private string _Name;
        		public string Name
        		{
            		get => _Name;
            		set
            		{
                			_Name = value;
            		}
        		}
    		}
}

 Lưu ý: Chữ event viết thường

Mục đích là mình mong muốn mỗi khi Name của class HocSinh thay đổi mình sẽ biết và có thể code xử lý tương ứng.

Ta tạo một class HocSinh có filed là _Name kiểu dữ liệu là string. Được đóng gói thành property Name.(Bạn để ý rằng mình cố ý tạo property và filed cùng tên nhưng khác nhau là filed có dấu _ phía trước tên. Như vậy vừa dễ quản lý vừa tiện cho việc code)

Lúc này chúng ta đã tạo một Delegate có tên là UpdateNameHandler cùng cấp với class Program class HocSinh . UpdateNameHandler có kiểu trả về là void, một tham số đầu vào là string. Ta cần tạo Delegate ở phạm vi này là vì muốn có thể được dùng cả trong class HocSinh và class Program.

Ta tạo event NameChanged thuộc class HocSinh lúc này có kiểu dữ liệu là Delegate UpdateNameHandler . Lưu ý cách đặt tên event thể hiện được tính chất là Name Changed(đã thay đổi)

Lưu ý: event phải public.


Khởi tạo và sử dụng Delegate trong C#

Event phải được ủy thác từ đối tượng cha của đối tượng chứa event . Bằng cách += hàm Delegate tương ứng vào event của đối tượng(Tương tự có thể loại bỏ bằng cách -=).

Ví dụ:

HocSinh hs = new HocSinh();

hs.NameChanged += Hs_NameChanged;

Hàm Hs_NameChanged lúc này được tự tạo ra bằng cách gõ cú pháp sau và nhấn phím tab một lần:

hs.NameChanged +=

Hàm Hs_NameChanged lúc này được tự tạo ra bên dưới hàm Main với kiểu trả về và tham số đầu vào tương ứng với Delegate UpdateNameHandler.

Hoặc bạn cũng có thể dùng anonymous method trong tình huống này:

hs.NameChanged += (name) =>
      {
            Console.WriteLine("Tên mới: " + name);
      };

Trong phương thức set của property Name. Mình sẽ gọi event NameChanged. Nhưng nếu như NameChanged chưa từng được ủy thác thì khi gọi sẽ bị null exception. Nên mình sẽ kiểm tra NameChanged null hay không? Nếu không null thì sẽ gọi event như hàm và truyền param tương ứng vào là Name.

Code hoàn chỉnh:    

namespace Event_Voi_Delegate
{
    public delegate void UpdateNameHandler(string name);
    class Program
    {
        static void Main(string[] args)
        {
            Console.OutputEncoding = Encoding.Unicode;

            HocSinh hs = new HocSinh();

            hs.NameChanged += Hs_NameChanged;

            hs.Name = "Kteam";
            Console.WriteLine("Tên từ class: " + hs.Name);
            hs.Name = "HowKteam.com";
            Console.WriteLine("Tên từ class: " + hs.Name);

            Console.ReadLine();
        }

        private static void Hs_NameChanged(string name)
        {
            Console.WriteLine("Tên mới: " + name);
        }
    }

    public class HocSinh
    {
        public event UpdateNameHandler NameChanged;

        private string _Name;
        public string Name
        {
            get => _Name;
            set
            {
                _Name = value;
                if(NameChanged != null)
                {
                    NameChanged(Name);
                }
            }
        }
    }
}

Kết quả: Khi chạy chương trình:

Event với Delegate trong C#

Bạn có thể thấy là mỗi khi mình set lại giá trị cho hs.Name thì hàm Hs_NameChanged đã được gọi ngay sau đó.


Kết luận

Nội dung bài này giúp các bạn nắm được:

  • Event với Delegate là gì?
  • Khai báo Event trong C#
  • Khởi tạo Event trong C#
  • Cách dùng Event trong C#

Bài học sau chúng ta sẽ cùng tìm hiểu về EVENT CHUẨN .NET TRONG C#.

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.


Tải xuống

Tài liệu

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Event với Delegate trong C# dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên likeshare để ủng hộ Kteam và tác giả nhé!

Project

Nếu việc thực hành theo hướng dẫn không diễn ra suôn sẻ như mong muốn. Bạn cũng có thể tải xuống PROJECT THAM KHẢO ở link bên dưới!


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.

Nội dung bài viết

Tác giả/Dịch giả

Khóa học

Khóa học lập trình C# nâng cao

Bạn đã học hết các khoá học về C# CƠ BẢN, LẬP TRÌNH WINFORM thậm chí là LẬP TRÌNH WPF nhưng vẫn bối rối trước những hướng dẫn về CÁC PROJECT THỰC TẾ của Kteam?

Hoặc bạn nghe nói mãi về .NET nhưng vẫn thắc mắc nó có gì hay ho bên trong đó?

Hay đơn giản bạn viết muốn 1 đoạn code cực kỳ nguy hiểm khiến người khác khi nhìn vào phải thốt lên: “Ồ!!!......... Trẻ trâu…”

Khoá học lần này sẽ giúp bạn giải đáp những thắc mắc trên. Chào mừng các bạn đã đến với khoá học Lập trình C# nâng cao của Kteam.

Đánh giá

Vo Tan Duc đã đánh giá 19:17 18-05-2023

KhueNguyencute đã đánh giá 19:56 13-09-2021

Vip quá :( nhưng phải đọc nhiều :3

cmstbita356 đã đánh giá 21:45 09-09-2021

nguyenhoangnhat đã đánh giá 12:42 04-12-2020

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
Tien.Nguyen đã bình luận 11:00 05-08-2021

Có hai điểm muốn thầy giải thích rõ hơn được không ạ:

1. Tại sao định nghĩa event lại là định nghĩa theo đối tượng, chứ ko phải là định nghĩa theo lớp:

HocSinh hs = new HocSinh();

hs.NameChanged += Hs_NameChanged;

private static void Hs_NameChanged(string name) { Console.WriteLine("Tên mới: " + name); }

như vậy hành động  Console.WriteLine("Tên mới: " + name) chỉ áp dụng được với đối tượng hs.

nếu trường hợp ta định nghĩa một đối tượng mới:

HocSinh hs2 = new HocSinh();

thì nó vẫn được kế thừa event NameChanged của lớp HocSinh.

thực tế khi gọi lệnh hs2.Nam = "NewName2"; thì chương trình vẫn gọi đến event NameChanged. chẳng qua lúc này Event này đang rỗng, chưa được định nghĩa.

Không biết cách hiểu như vậy có đúng không thầy?

2. Khi nào thì event NameChanged = null

set { _Name = value; if(NameChanged != null) { NameChanged(Name); } }

Quote: "Nhưng nếu như NameChanged chưa từng được ủy thác thì khi gọi sẽ bị null exception."

như vậy, nếu với đối tượng hs ta đã định nghĩa event Hs_NameChanged, như vậy giá trị NameChanged != null.

Còn với đối tượng hs2, ta chưa định nghĩa event Hs2_NameChanged, trường hợp đó giá trị NameChanged = null.

Như vậy có đúng ko ạ?

 

 

 

sinhvienit đã bình luận 22:22 20-06-2021

hơi rối.

 

C#study đã bình luận 21:03 27-05-2020

Đợi mãi :L

Không có video.