Delegate trong C#

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

5.0 (5 đánh giá)
Tạo bởi K9 Cập nhật lần cuối 5 năm trước 48.271 lượt xem 5 bình luận
Tác giả/Dịch giả: K9
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ụ:

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ụ:

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

Delegate trong C#

Để 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ụ:

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 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.

Khi cần loại bỏ Delegate trong multicast bạn chỉ việc trừ Delegate ra


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:

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.

Ý 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ó”.


Tải xuống

Tài liệu

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Delegate trong C# dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên likeshare để ủng hộ Kteam và tác giả nhé!


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ê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.

Tác giả/Dịch giả

K9

Nhà sáng lập Howkteam.com, KQuiz.vn & 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á

Vo Tan Duc đã đánh giá 2 năm trước

Hay quá anh Long ơi!

Chuthuong đã đánh giá 3 năm trước

Thoại đã đánh giá 3 năm trước

Harold Nguyen đã đánh giá 4 năm trước

Drnxloc đã đánh giá 4 năm trước

gút chóp

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
Le Rachitique đã bình luận 3 năm trước

bạn ơi, không thấy bài ILIST TRONG C# ở đâu cả.

jadonsanch0 đã bình luận 4 năm trước

Javascript là một ngôn ngữ Weakly-typed, không cần kiểu dữ liệu của biến, ví dụ func(func1) {func1()} thì lời gọi Callback chính là func1(); 

C# cũng callback nhưng cần định nghĩa một prototype cho hàm được trỏ tới :V nên xài delegate để bắt hàm đó lại :V hiểu ngu :V

Nerosaro đã bình luận 4 năm trước

tuyệt vời HowKTeam, dễ hiểu hơn trên trường nhiều

Stick1337 đã bình luận 4 năm trước

Hay quá Kteam ơi

trung1508 đã bình luận 4 năm trước

Bạn cho xin link download bài này. Thanks.

 

Không có video.