Cần giải thích về delegate trong c#

Chào các bạn, mình mới học lập trình C#, đọc đến chỗ delegate thì chẳng hiểu gì cả. Mong các bạn giải thích rõ cho mình. mình xin cảm ơn. :sweat:

Delegate : cơ chế ủy quyền tương tự con trỏ hàm của C++ vậy. Nó là một kiểu dữ liệu tham chiếu được lưu trên heap

1 Like

Bạn làm ơn nói rõ hơn được không, mình mới học qua c, chưa học c++ nên cũng chẳng hiểu lắm.

Nói nôm na Delegate nó là một kiểu dữ liệu tham chiếu tương tự class vậy. Nó đóng gói địa chỉ của các hàm function. Khi gọi thực hiện Delegate thì hàm được đóng gói sẽ thực hiện. Delegate nó có thể truyền vào làm tham số cho hàm còn Function thì k

using System;

namespace Delegatest
{
    class Program
    {
        public delegate void SayAnything();//tạo delegate không tham số , trả về void
        static void Main(string[] args)
        {
            Program p = new Program();//tạo thể hiện của Program để dùng non-static member trong Main
            SayAnything sayHello = new SayAnything(p.Hello);//tạo thể hiện sayHello đóng gói hàm Hello
            sayHello();//thực hiện sayHello -> thực hiện Hello
            p.SaySomething(sayHello);//truyền sayHello (-> truyền hàm Hello) vào SaySomething
            //ở đây, không thể viết p.Saysomething(Hello);
        }
        public void Hello()
        {
            Console.WriteLine("Hello");
        }
        public void SaySomething(SayAnything s)
        {
            s();//thực hiện delegate được truyền vào
        }
    }
}
3 Likes

Thanks bạn, mình cũng hiểu thêm được rồi

Mình có 1 bài viết khá dễ hiểu về callback và delegate trong C#, bạn có thể vào đây để đọc nhé:

2 Likes

Cảm ơn bạn. Mà bạn có bài nào về Event không cho mình xin luôn.

Event thật ra chỉ là 1 dạng wrapper của delegate thôi bạn. Thay vì gán delegate, event cho phép add, remove (+ -), ngoài ra với event thì chỉ class chứa chính event đó mới gọi nó được.

1 Like

wrapper là gì vậy bạn? :stuck_out_tongue_closed_eyes:

cho mình hỏi chút, delegate nó hữu dụng trong hoàn cảnh nào nhỉ? như mình thấy trong ví dụ của bạn ở hàm main có đề cập:

Program p = new Program();
SayAnything sayHello = new SayAnything(p.Hello);
sayHello();
p.SaySomething(sayHello);

nhưng nếu dùng class là

Program p = new Program();
p.Hello; 

cũng được mà? mình không rõ lắm mong bạn dựa trên kinh nghiệm giúp mình hiểu rõ hơn, tks :smiley:

Khi một đối tượng sinh ra. Nó không thể biết về sự tồn tại và can thiệp được vào dữ liệu của đối tượng khác.

Nếu nó muốn dữ liệu bên trong nó được xử lý ở một nơi khác bên ngoài nó. Nơi mà nó không hề biết. Thì đó là chức năng chính của delegate.

Nếu nó muốn dữ liệu được tiếp tục xử lý ở nhiều nơi. Đó là chức năng của event.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?