C# Cơ bản .NET Core §1) Cài đặt, chương trình C# đầu tiên §2) Biến, kiểu dữ liệu và nhập/xuất §3) Toán tử số học và gán §4) So sánh, logic và lệnh if, switch §5) Vòng lặp for, while §6) Phương thức - Method §7) Phương thức - Delegate §8) Lớp - Class §9) Kiểu vô danh và dynamic §10) Biểu thức lambda §11) Event §12) Hàm hủy - Quá tải toán tử - thành viên tĩnh - indexer §13) Lớp lồng nhau - namespace §14) null và nullable §15) Mảng §16) Chuỗi ký tự §17) Tính kế thừa §18) Tính đa hình - abstract - interface §19) Struct và Enum §20) Ngoại lệ Exeption §21) IDisposable - using §22) File cơ bản §23) FileStream §24) Generic §25) Collection - List §26) SortedList §27) Queue / Stack §28) Linkedlist §29) Dictionary - HashSet §30) Phương thức mở rộng §31) ObservableCollection §32) LINQ §33) (Multithreading) async - bất đồng bộ §34) Type §35) Attribute Annotation §36) DI Dependency Injection §37) (Multithreading) Parallel §38) (Networking) HttpClient §39) (Networking) HttpMessageHandler §40) (Networking) HttpListener §41) (Networking) Tcp TcpListenerr/TcpClient §42) (ADO.NET) SqlConnection §43) (ADO.NET) SqlCommand §44) (EF Core) Tổng quan §45) (EF Core) Tạo Model §46) (EF Core) Fluent API §47) (EF Core) Query §48) (EF Core) Scaffold §49) (EF Core) Migration §50) (ASP.NET CORE) Hello World! §51) (ASP.NET CORE) Middleware §52) (ASP.NET CORE) Map - Request - Response §53) (ASP.NET CORE) IServiceCollection - MapWhen §54) (ASP.NET CORE) Session - ISession §55) (ASP.NET CORE) Configuration §56) (ASP.NET CORE MVC) Controller - View

Các hàm mở rộng

Các phương thức mở rộng là các phương thức thêm vào lớp, cấu trúc, giao diện có sẵn mà không cần thiết phải kế thừa lớp để tạo ra các lớp mới, không cần biên dịch lại thư viện. Thực chất thì các phương thức mở rộng là những phương thức tĩnh, nhưng lại được gọi thông qua đối tượng lớp mà phương thức mở rộng đó khai báo.

Kỹ thuật dùng hàm mở rộng để bổ sung các tính năng cho thư viện sẵn có được dùng rất nhiều trong thư viện LINQ - để mở rộng chức năng cho các IEnumerable

Xem ví dụ sau:

using System.Collections.Generic;

namespace ViduPTMorong
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> ls = new List<int>() {1,2,3,4};
            var ps = ls.Where(i => i >= 3);             // Lỗi vì List không có phương thức Where
        }
    }
}

Giờ sửa lại code như sau:

using System.Collections.Generic;
using System.Linq;                                      // Nạp thư viện LINQ

namespace ViduPTMorong
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> ls = new List<int>() {1,2,3,4};
            var ps = ls.Where(i => i >= 3);             // Linq đã mở rộng thêm vào List phương thức Where
        }
    }
}

Khai báo phương thức mở rộng

Hãy tạo một phương thức tĩnh sau, phương thức này in chuỗi ra màn hình với màu Console nhập vào.

public static void Print(string s, ConsoleColor color = ConsoleColor.Yellow)
{
     ConsoleColor lastColor = Console.ForegroundColor;
     Console.ForegroundColor = color;
     Console.WriteLine(s);
     Console.ForegroundColor = lastColor;
}

Đây là một phương thức tĩnh bình thường, sử dụng nó để in một chuỗi ra màn hình, chuỗi nhập ở tham số thứ nhất

Print("Test string ...");

Giờ nếu muốn hàm Print như một hàm mở rộng của đối tượng kiểu string, ta sẽ thực hiện như sau:

  • Chuyển khai báo Print trong một lớp tĩnh
  • Đảm bảo Print là phương thức tĩnh
  • Tham số đầu tiên của hàm là kiểu string, cho thêm từ khóa this vào phía trước - để cho biết sẽ mở rộng lớp string với phương thức này.
public static class MyExtensionMethods {
     public static void Print(this string s, ConsoleColor color = ConsoleColor.Yellow)
     {
         ConsoleColor lastColor = Console.ForegroundColor;
         Console.ForegroundColor = color;
         Console.WriteLine(s);
         Console.ForegroundColor = lastColor;
     }
}

Bằng cách khai báo như trên, đã mở rộng string, thêm vào nó phương thức Print, hàm này sẽ được gọi trên đối tượng lớp string.

string s = "Chuỗi kiểm tra";
s.Print();

Bằng cách như vậy bạn có thể mở rộng các lớp có sẵn.

Đăng ký theo dõi ủng hộ kênh