1. Trang chủ
  2. » Công Nghệ Thông Tin

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

3 393 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 3
Dung lượng 118,54 KB

Nội dung

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 1

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

Trang 2

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;

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

}

}

}

Ngày đăng: 12/07/2014, 19:20

TỪ KHÓA LIÊN QUAN

w