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
Ttừ đối số truyền vào (không cần viếtSwap<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
- Type Safety: Lỗi kiểu bị bắt tại compile-time.
- Performance: Tránh boxing/unboxing cho value types.
- Code Reuse: Viết một lần, dùng cho mọi kiểu.
- IntelliSense: Hỗ trợ hoàn toàn trong IDE.