Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Phương thức Generic (Generic Methods) trong C#

Generic Method là phương thức có tham số kiểu (type parameter) <T>, cho phép hoạt động với nhiều kiểu dữ liệu khác nhau mà vẫn an toàn kiểu (type-safe) và không boxing/unboxing.

Cú pháp

public static KieuTraVe TenPhuongThuc<T>(T param1, T param2)
{
    // Thân phương thức dùng T như kiểu bình thường
}

Ví dụ điển hình: Swap (Hoán đổi)

using System;

class Utility
{
    // Generic method swap 2 biến bất kỳ kiểu
    public static void Swap<T>(ref T a, ref T b)
    {
        T temp = a;
        a = b;
        b = temp;
    }
    
    // Generic method với constraint
    public static T Max<T>(T a, T b) where T : IComparable<T>
    {
        return a.CompareTo(b) > 0 ? a : b;
    }
}

class Program
{
    static void Main()
    {
        // Dùng với int
        int a = 45, b = 60;
        Console.WriteLine($"Trước swap: a={a}, b={b}");
        Utility.Swap(ref a, ref b);
        Console.WriteLine($"Sau swap: a={a}, b={b}");
        
        // Dùng với char
        char c = 'K', d = 'P';
        Console.WriteLine($"\nTrước swap: c={c}, d={d}");
        Utility.Swap(ref c, ref d);
        Console.WriteLine($"Sau swap: c={c}, d={d}");
        
        // Dùng với string
        string s1 = "Hello", s2 = "World";
        Console.WriteLine($"\nMax string: {Utility.Max(s1, s2)}"); // World
        
        // Type inference: không cần chỉ rõ , ...
        // Utility.Swap(ref a, ref b); // Cũng được nhưng thừa
    }
}

Kết quả

Trước swap: a=45, b=60
Sau swap: a=60, b=45

Trước swap: c=K, d=P
Sau swap: c=P, d=K

Max string: World

Các khái niệm quan trọng

  • Type Inference: Trình biên dịch tự suy ra T từ đối số truyền vào (không cần viết Swap<int>).
  • Constraints (Ràng buộc): where T : class, struct, new(), IComparable<T>, base class, interface... cho phép gọi thành viên cụ thể trên T.
  • Generic Method trong Non-generic Class: Class không generic vẫn có thể chứa generic method.
  • Overload: Có thể overload generic method với số lượng type parameter khác nhau.

Lợi ích

  1. Type Safety: Lỗi kiểu bị bắt tại compile-time.
  2. Performance: Tránh boxing/unboxing cho value types.
  3. Code Reuse: Viết một lần, dùng cho mọi kiểu.
  4. IntelliSense: Hỗ trợ hoàn toàn trong IDE.