Delegate trong C#

Khóa học lập trình C# nâng cao

0.0 (0 đánh giá)
Tạo bởi K9 Cập nhật lần cuối 23:27 24-05-2020 1.360 lượt xem 0 bình luận
Học nhanh

Danh sách bài học

Delegate trong C#

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 các bạn nên có kiến thức cơ bản về các phần:

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

  • 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 <kiểu trả về> <tên delegate> (<danh sách tha số nếu có>);

Ví dụ:

delegate int MyDelegate(string s);

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

Lúc này 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ố đầu vào là string.

MyDelegate lúc này có thể dùng làm kiểu dữ liệu cho mọi Delegate tới hàm tương ứng kiểu trả về và tham số đầu 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:

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

  • Ở đây mình tạo một hàm ConvertStringToInt làm nhiệm vụ là chuyển kiểu dữ liệu của một số từ string sang int.
  • Mình sử dụng Delegate bằng cách tạo một biến convertToInt có kiểu dữ liệu là MyDelegate. convertToInt này mình new MyDelegate vớ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 numberSTR kiểu string khởi tạo giá trị là 35.
  • Mình tạo một biến valueConverted kiểu int khởi tạo nó bằng kết quả gọi Delegate convertToInt với tham số truyền vào Delegate là 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ư một hàm bình thường.

Do MyDelegate đã khởi tạo đồng nhất kiểu dữ liệu trả về và tham số đầu vào với hàm ConvertStringToInt nên convertToInt mới thỏa mãn điều kiện 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 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 hiện tuần từ các 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

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 Console chuỗi truyền vào. Mình tạo thêm 2 Delegate showString tham chiếu tới hàm ShowString multicast là kết quả cộng của 2 Delegate convertToInt showString .

Mình gọi Delegate multicast để thực hiện 1 lần 2 Delegate tuần tự là convertToInt showString.

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

Khi cần loại bỏ 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:

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

Ý 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 các 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 hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần BÌNH LUẬN bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.

Nội dung bài viết

Tác giả/Dịch giả

K9

Nhà sáng lập Howkteam.com & tác giả các khóa học C#, Auto, Unity3D, Python....

Với mong muốn mang đến kiến thức chất lượng, miễn phí cho mọi người, với tâm huyết phá bỏ rào cản kiến thức từ việc giáo dục thu phí. Tôi đã cùng đội ngũ Kteam đã lập nên trang website này để thế giới phẳng hơn.
Hãy cùng chúng tôi lan tỏa kiến thức đến cộng đồng! 

Khóa học

Khóa học lập trình C# nâng cao

Bạn đã học hết các khoá học về C# CƠ BẢN, LẬP TRÌNH WINFORM thậm chí là LẬP TRÌNH WPF nhưng vẫn bối rối trước những hướng dẫn về CÁC PROJECT THỰC TẾ của Kteam?

Hoặc bạn nghe nói mãi về .NET nhưng vẫn thắc mắc nó có gì hay ho bên trong đó?

Hay đơn giản bạn viết muốn 1 đoạn code cực kỳ nguy hiểm khiến người khác khi nhìn vào phải thốt lên: “Ồ!!!......... Trẻ trâu…”

Khoá học lần này sẽ giúp bạn giải đáp những thắc mắc trên. Chào mừng các bạn đã đến với khoá học Lập trình C# nâng cao của Kteam.

Đánh giá

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
Không có video.