Tải bản đầy đủ (.pdf) (3 trang)

Sự khác nhau giữa Event và Deleg pot

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (118.54 KB, 3 trang )

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();
}
}
}


×