Thứ Tư, 4 tháng 8, 2010

// // Leave a Comment

Delegate là gì?

Bạn biết gì về delegate?
Bạn lập trình cũng được một thời gian dài, đặc biệt là C#. Khi sử dụng delegate bạn có bao giờ để ý đến cách khởi tạo nó không và các toán tử đi kèm có ý nghĩa như thế nào?
Cho đến hôm nay mình mới hiểu ra được các cách khởi gán delegate và ý nghĩa của nó. Việc hiểu rõ và nắm chắc delegate là điều hết sức quan trọng và nó được sử dụng hầu hết trong các ứng dụng tính toán nhiều và xử lý các sự kiện độc lập
Với delegate thì cú pháp khai báo của nó như sau:
delegate result-type identifier ([parameters]);
Ví dụ: public delegate void SimpleDelegate (params object obj)
Nghĩa là ta đi khai báo một delegate trỏ tới một phương thức có giá trị trả về là kiểu void, tham số là danh sách các params đối tượng object obj.
Multicasting:
Điều này thật thú vị khi làm việc với delegate đó là Multicasting, nghĩa là nó có thể trỏ đến nhiều hàm cùng 1 lúc (System.MulticastDelegate). Multicase delegate lưu trữ danh sách tất cả các hàm mà nó sẽ được gọi khi thực thi delegate.
Cũng giống như class, delegate có cách khai báo tương tự bằng việc sử dụng toán tử new. Ngoài ra ta có thể gán trực tiếp thông qua các phép gán thông thường =, +=, -=.
Ví dụ: Giả sử ta đang có một hàm kiểu void tên là DoSomething() không đối số, và ta khai báo một delegate như sau
public delegate void SimpleDelegate();
Thì tương ứng ta có các cách khai báo một thể hiện của SimpleDelegate như sau:
SimpleDelegate _simpleDelegate;
_simpleDelegate = new SimpleDelegate(DoSomething);
_simpleDelegate += new SimpleDelegate(DoSomething);
_simpleDelegate -= new SimpleDelegate(DoSomething);
_simpleDelegate = DoSomething;
_simpleDelegate += DoSomething;
_simpleDelegate -= DoSomething;
_simpleDelegate += DoHomework;

Và tiếp đó ta chỉ việc gọi nó ra thông qua một sự kiện cụ thể nào đó,
bằng cách:
   _simpleDelegate();
hoặc:
   _simpleDelegate.Invoke();
Và dưới đây là một ví dụ cụ thể:
    delegate void FunctionToCall(ref int x);
    class Delegate2
    {
        public static void Add2(ref int x)
        {
            x += 2;
        }
        public static void Add3(ref int x)
        {
            x += 3;
        }
        static void Main(string[] args)
        {
            FunctionToCall functionDelegate = Add2;// Khai báo đồng thời gán bằng Add2
            functionDelegate += Add3;
            functionDelegate += Add2;
            functionDelegate += Add2;

            int x = 5;
            functionDelegate(ref x); // Gọi delegate
            Console.WriteLine("Value: {0}", x);

            int y = 5;
            functionDelegate = Add2;
            functionDelegate += Add3;
            functionDelegate -= Add2;

            functionDelegate(ref y); // Gọi delegate
            Console.WriteLine("Value: {0}", y);

            Console.ReadLine();
        }
    }
Ví dụ này vui đấy mọi người test thử để biết kết quả nhé...
Và điều phải lưu ý là không được để null khi gọi delegate.

Để hiểu rõ hơn về delegate bạn nên xem bài viết này
http://vubka.blogspot.com/2010/08/su-khac-nhau-giua-delegate-va-event.html

0 comments: