WWW.CSHARPVN.COM C# Cơ Bản Biên tập Nguồn: vubka Sự Khác Nhau Giữa Event và Delegate Chúng ta có thể làm những ñiều tương tự với cả hai cách sử dụng delegate và event, và dường như chúng chỉ khác nhau về cú pháp khai báo? Bạn và tôi sẽ cùng nhau phân biệt delegate và event thông qua các ví dụ dưới ñây, xem sự rõ ràng của chúng trong cách sử dụng. Dưới ñây là cú pháp khai báo: Delegate: public class VubkaDelegate { public delegate void ExampleDelegate(); public ExampleDelegate DeleageteCallback; } Event: public class VubkaEvent { public delegate void ExampleEvent(); public event ExampleEvent EventCallback; } Như vậy ta mới thấy ñược sự khác nhau của chúng cơ bản thông qua từ khóa event Và có một câu hỏi ñặt ra là tại sao chúng ta có thêm 1 từ khóa mà trong khi ta vẫn có thể hoàn tất công việc nếu như không sử dụng nó (thiếu từ khóa event). Vấn ñề ñặt ra là sự tồn tại của từ khóa event trong cách khai báo một sự kiện có ý nghĩa như thế nào. Tiếp tục ví dụ trên, cùng xem cách sử dụng chúng như thế nào ñối với lớp này VubkaDelegate _vubkaDelegate = new VubkaDelegate(); _vubkaDelegate.DelegateCallback += new VubkaDelegate.ExampleDelegate(SayHello); Ta sẽ thêm vào danh sách gọi hàm của delegate. ðoạn mã tương tự trên vẫn tiếp tục hoạt ñộng và dường như không có vấn ñề gì cả VubkaEvent _vubkaEvent = new VubkaEvent(); _vubkaEvent.EventCallback += new VubkaEvent.ExampleEvent(SayHello); Bây giờ, ta sẽ thử thay thế cách thêm danh sách gọi hàm của delegate , ñơn giản ta chỉ gán delegate tới new delegate (sử dụng phép gán =, không phải là +=) Ta sẽ thử thay ñoạn mã như sau: VubkaDelegate _vubkaDelegate = new VubkaDelegate(); _vubkaDelegate.DelegateCallback = new VubkaDelegate.ExampleDelegate(SayHello); WWW.CSHARPVN.COM C# Cơ Bản Biên tập Nguồn: vubka Với ñoạn mã trên thì nó hoạt ñộng tốt nhưng nó sẽ không thể áp ñặt cho 1 event :D Và ñiều này có nghĩa là chúng ta sử dụng từ khóa event thì không có lớp client nào có thể áp ñặt cho nó trỏ tới null. ðiều này là hết sức quan trọng. Nhiều client có thể sử dụng delegate giống nhau. Sau khi chúng ñã trỏ thêm 1 hàm ñể nghe (listen) lời gọi lại (callback) của delegate. Nhưng giờ 1 client áp ñặt delegate trỏ tới null hoặc sử dụng dấu = ñể gán tới 1 lời gọi mới. ðiều này có nghĩa danh sách gọi hàm trước ñó bị mất hết. Do ñó tất cả các client trước ñó sẽ không thể thực hiện bất kỳ 1 lời gọi nào nều như chúng ñã ñăng ký gọi hàm trước ñó. Kết luận: - Chúng ta có thể nói rằng từ khóa event nó có thêm 1 tầng bảo vệ cho các thể hiện (instance) của delegate. Nó chống lại bất cứ client nào thiết ñặt lại danh sách lời gọi hàm. Và chúng chỉ có thể thêm hoặc loại bỏ ñích trỏ hàm ñang tồn tại trong danh sách gọi hàm. - Và bản thân event chỉ giúp ta ñăng ký hoặc loại bỏ (bởi 2 toán tử += hoặc -=) gọi hàm cho delegate khi có sự kiện xảy ra. ðoạn code của chương trình using System; using System.Collections.Generic; using System.Text; namespace BKIndex.Vunb.Net.Assigment1 { class Program { static void Main(string[] args) { // Declare instances Delegate and Event VubkaDelegate _vubkaDelegate = new VubkaDelegate(); VubkaEvent _vubkaEvent = new VubkaEvent(); _vubkaDelegate.DelegateCallback += new VubkaDelegate.ExampleDelegate(SayHello); _vubkaEvent.EventCallback += new VubkaEvent.ExampleEvent(SayHello); _vubkaDelegate.DelegateCallback.Invoke(); // using Invoke method _vubkaEvent.Fire(); Console.WriteLine(" "); _vubkaDelegate.DelegateCallback += new VubkaDelegate.ExampleDelegate(SayHello); _vubkaEvent.EventCallback += new VubkaEvent.ExampleEvent(SayHello); _vubkaDelegate.DelegateCallback(); _vubkaEvent.Fire(); Console.WriteLine(" "); _vubkaDelegate.DelegateCallback = null; // Or _vubkaDelegate.DelegateCallback = SayHello; WWW.CSHARPVN.COM C# Cơ Bản Biên tập Nguồn: vubka /* not OK // _vubkaEvent.EventCallback = new VubkaEvent.ExampleEvent(SayHello); // _vubkaEvent.ExampleEvent = null; */ Console.WriteLine("NOT OK!!!"); Console.WriteLine(" "); /* Only sign, OK */ _vubkaEvent.EventCallback -= SayHello; _vubkaDelegate.DelegateCallback(); _vubkaEvent.Fire(); } static void SayHello() { Console.WriteLine("Hello!"); } } public class VubkaDelegate { public delegate void ExampleDelegate(); public ExampleDelegate DelegateCallback; } public class VubkaEvent { public delegate void ExampleEvent(); public event ExampleEvent EventCallback; protected virtual void OnEventCallback() { if (EventCallback != null) EventCallback(); } public void Fire() { OnEventCallback(); } } } . vubka Sự Khác Nhau Giữa Event và Delegate Chúng ta có thể làm những ñiều tương tự với cả hai cách sử dụng delegate và event, và dường như chúng chỉ khác nhau về cú pháp khai báo? Bạn và tôi. instances Delegate and Event VubkaDelegate _vubkaDelegate = new VubkaDelegate(); VubkaEvent _vubkaEvent = new VubkaEvent(); _vubkaDelegate.DelegateCallback += new VubkaDelegate.ExampleDelegate(SayHello);. public delegate void ExampleDelegate(); public ExampleDelegate DeleageteCallback; } Event: public class VubkaEvent { public delegate void ExampleEvent(); public event ExampleEvent EventCallback;