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
Trang 1Sự 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);
Trang 2Vớ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;
Trang 3/* 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();
}
}
}