Delegate trong C# | How Kteam

Dẫn nhập

Ở bài học trước, chúng ta đã cùng nhau tìm hiểu về ILIST TRONG C#. Hôm nay chúng ta sẽ cùng tìm hiểu về Delegate trong C#.

Nội dung

Để đọc hiểu bài này tốt nhất những bạn nên có kiến thức và kỹ năng cơ bản về những phần :

Trong bài học này, chúng ta sẽ cùng tìm hiểu các vấn đề:

Bạn đang đọc: Delegate trong C# | How Kteam

  • Delegate là gì?
  • Khai báo Delegate trong C#
  • Khởi tạo Delegate trong C#
  • Multicast(đa hướng) một Delegate trong C#
  • Cách dùng Delegate trong C#
  • Dùng Delegate như một call-back function

Delegate là gì?

Delegate trong C# tương tự như con trỏ hàm trong C hoặc C++.

Delegate là một biến kiểu tham chiếu(references) chứa tham chiếu tới một phương thức.

Tham chiếu của Delegate có thể thay đổi runtime (khi chương trình đang thực thi).

Delegate thường được dùng để triển khai các phương thức hoặc sự kiện call-back.

Bạn cứ hiểu Delegate là một biến bình thường, biến này chứa hàm mà bạn cần gọi. Sau này lôi ra sài như hàm bình thường. Giá trị của biến Delegate lúc này là tham chiếu đến hàm. Có thể thay đổi runtime khi chương trình đang chạy.

Delegate được dẫn xuất từ lớp System. Delegate trong C # .

Khai báo Delegate trong C#

Khai báo Delegate trong C# sẽ tương tự như khai báo một biến. Nhưng cần thêm từ khóa Delegate để xác định đây là một Delegate. Đồng thời vì Delegate là để tham chiếu đến một hàm, nên cũng cần khai báo kèm kiểu dữ liệu trả về của và tham số đầu vào của Delegate tương ứng với hàm tham chiếu.

Công thức :

delegate ();

Ví dụ:

delegate int MyDelegate(string s);

Lưu ý: Chữ delegate viết thường

Lúc này tất cả chúng ta đã tạo một Delegate có tên là MyDelegate. MyDelegate có kiểu trả về là int, một tham số nguồn vào là string .
MyDelegate lúc này hoàn toàn có thể dùng làm kiểu tài liệu cho mọi Delegate tới hàm tương ứng kiểu trả về và tham số nguồn vào .

Khởi tạo và sử dụng Delegate trong C#

Khi kiểu Delegate được khai báo, đối tượng Delegate phải được tạo với từ khóa new và được tham chiếu đến một phương thức cụ thể. Phương thức này phải cùng kiểu trả về và tham số đầu vào với Delegate đã tạo.

Khi tạo một Delegate, tham số được truyền với biểu thức new được viết tương tự như một lời gọi phương thức, nhưng không có tham số tới phương thức đó. Tức là chỉ truyền tên hàm vào thôi. Delegate sẽ tự nhận định hàm được đưa vào có cùng kiểu dữ liệu trả ra và cùng tham số đầu vào hay không.

Ví dụ:

class Program
    	{
        delegate int MyDelegate(string s);
        static void Main(string[] args)
        {
            Console.OutputEncoding = Encoding.Unicode;

            MyDelegate convertToInt = new MyDelegate(ConvertStringToInt);

            string numberSTR = "35";

            int valueConverted = convertToInt(numberSTR);

Console.WriteLine("Giá trị đã convert thành int: " + valueConverted);

            Console.ReadLine();
        }

        static int ConvertStringToInt(string stringValue)
        {
            int valueInt = 0;

            Int32.TryParse(stringValue, out valueInt);
Console.WriteLine("Đã ép kiểu dữ liệu thành công");

            return valueInt;        
        }
    	}

Kết quả chạy chương trình :

Delegate trong C#

Để những bạn hiểu rõ hơn về đoạn code trên thì mình sẽ lý giải một chút ít :

  • Ở đây mình tạo một hàm ConvertStringToIntlàm nhiệm vụ là chuyển kiểu dữ liệu của một số từ stringsang int.
  • Mình sử dụng Delegatebằng cách tạo một biến convertToIntcó kiểu dữ liệu là MyDelegate. convertToIntnày mình new MyDelegatevới tham số đầu vào là tên hàm

    ConvertStringToInt  

    (lưu ý chỉ tên hàm thôi).

  • Mình có biến numberSTRkiểu string khởi tạo giá trị là 35.
  • Mình tạo một biến valueConvertedkiểu intkhởi tạo nó bằng kết quả gọi DelegateconvertToIntvới tham số truyền vào Delegatelà biến numberSTR.
  • Kết quả xuất ra màn hình Console là số 35.

Nhận thấy Delegate convertToInt mình sử dụng tương tự như như một hàm thông thường .
Do MyDelegate đã khởi tạo như nhau kiểu tài liệu trả về và tham số nguồn vào với hàm ConvertStringToInt nên convertToInt mới thỏa mãn nhu cầu điều kiện kèm theo khởi tạo và sử dụng của hàm ConvertStringToInt này .

Vậy Delegate bản chất chỉ là một biến thay thế cho hàm, biến này tham chiếu đến hàm nó muốn tham chiếu để thay thế khi dùng. Cách dùng y như gọi một hàm.

Vì sao cần Delegate? Khi bạn cần dùng một hàm như một biến ví dụ như tham số truyền vào của một hàm, hàm call-back, event…

Multicast(đa hướng) một Delegate trong C#

Khi bạn cần thực hiện một chuỗi hàm với cùng kiểu trả về và cùng tham số đầu vào mà không muốn gọi nhiều hàm tuần tự (chỉ gọi 1 hàm 1 lần duy nhất). Lúc này bạn sẽ cần dùng đến Multicast Delegate.

Bản chất bạn hoàn toàn có thể làm một chuỗi Delegate cùng kiểu Delegate bằng cách dùng toán tử +. Lúc này khi bạn gọi Delegate sẽ thực thi tuần từ những Delegate được cộng vào với nhau .

Bạn có thể loại bỏ Delegate trong multicast bằng toán tử.

Ví dụ:

class Program
    	{
        delegate int MyDelegate(string s);
        static void Main(string[] args)
        {
            Console.OutputEncoding = Encoding.Unicode;

            MyDelegate convertToInt = new MyDelegate(ConvertStringToInt);

            MyDelegate showString = new MyDelegate(ShowString);

            MyDelegate multicast = convertToInt + showString;

            string numberSTR = "35";

            int valueConverted = convertToInt(numberSTR);

Console.WriteLine("Giá trị đã convert thành int: " + valueConverted);

            Console.WriteLine("Kết quả khi gọi multicast Delegate");
            multicast(numberSTR);

            Console.ReadLine();
        }

        static int ConvertStringToInt(string stringValue)
        {
            int valueInt = 0;

            Int32.TryParse(stringValue, out valueInt);
            Console.WriteLine("Đã ép kiểu dữ liệu thành công");

            return valueInt;        
        }

        static int ShowString(string stringValue)
        {
            Console.WriteLine(stringValue);
            return 0;
        }
    	}

Kết quả: khi chạy chương trình

Delegate trong C#

Dùng lại ví dụ của phần trước .
Mình tạo thêm hàm ShowString với mục dích là xuất ra màn hình hiển thị Console chuỗi truyền vào. Mình tạo thêm 2 Delegate là showString tham chiếu tới hàm ShowString và multicast là hiệu quả cộng của 2 Delegate convertToInt và showString .
Mình gọi Delegate multicast để thực thi 1 lần 2 Delegate tuần tự là convertToInt và showString .

Console.WriteLine("Kết quả khi gọi multicast Delegate");
multicast(numberSTR);

Khi cần vô hiệu Delegate trong multicast bạn chỉ việc trừ Delegate ra

multicast = multicast - showString;

Dùng Delegate cho call-back function

Như mình đã nói ở trên, Delegate cũng là một biến. Vậy nên mình có thể truyền Delegate vào hàm làm parameter như biến bình thường. Lúc này Delegate này sẽ được gọi là call-back function. Mục đích của việc này là hàm nhận call-back function là param có thể gọi Delegate được đưa vào khi nào cần như ví dụ sau:


  delegate int MyDelegate(string s);
        static void Main(string[] args)
        {
            Console.OutputEncoding = Encoding.Unicode;           

            MyDelegate showString = new MyDelegate(ShowString);            

            NhapVaShowTen(showString);

Console.ReadLine();
        }

        static void NhapVaShowTen(MyDelegate showTen)
        {
            Console.WriteLine("Mời nhập tên của bạn:");
            string ten = Console.ReadLine();
            showTen(ten);
        }

        static int ShowString(string stringValue)
        {
            Console.WriteLine(stringValue);
            return 0;
      }

Kết quả:  Khi chạy chương trình:

Delegate trong C#

Như bạn thấy, mình đã sử dụng Delegate làm call-back function thành công xuất sắc .

Ý nghĩa của ví dụ là mỗi khi người dùng nhập vào tên của mình thì sẽ gọi Delegate ShowString để hiển thị tên người dùng vừa nhập vào ra màn hình console. Vậy lúc này hàm ShowString này hoàn toàn có thể được định nghĩa do người dùng mà không cần can thiệp vào code của hàm NhapVaShowTen.

Kết luận

Nội dung bài này giúp những bạn nắm được :

  • Delegate là gì?
  • Khai báo Delegate trong C#
  • Khởi tạo Delegate trong C#
  • Multicast(đa hướng) một Delegate trong C#
  • Cách dùng Delegate trong C#
  • Dùng Delegate như một call-back function

Bài học sau chúng ta sẽ cùng tìm hiểu về EVENT TRONG C#.

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.

Thảo luận

Nếu bạn có bất kể khó khăn vất vả hay vướng mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI và ĐÁP trên thư viện Howkteam. com để nhận được sự tương hỗ từ hội đồng .