Từ khoá params trong C# 13 khi làm việc với Collection

Từ khoá params trong C# 13 khi làm việc với Collection

February 5, 2025 0 By Nam Vu

Trong các version trước của C#, từ khóa params chỉ hỗ trợ mảng (array), cho phép một phương thức nhận một số lượng tham số không xác định. Nhưng trong C# 13, tính năng này đã được mở rộng để hỗ trợ nhiều loại collection khác nhau, giúp cải thiện tính linh hoạt và hiệu suất của ứng dụng.

Từ khoá params trong các phiên bản C# trước cụ thể là trước C# 13, khi muốn tạo một phương thức chấp nhận nhiều tham số mà không cần khai báo từng giá trị riêng lẻ, params là lựa chọn bắt buộc nhưng chỉ có thể sử dụng với mảng.

Ví dụ:

void PrintNumbers(params int[] numbers)
{
    foreach (var num in numbers)
    {
        Console.WriteLine(num);
    }
}
PrintNumbers(1, 2, 3, 4, 5);

Phương thức PrintNumbers có thể nhận một số lượng tham số không xác định và tự động gom chúng thành một mảng int[]. Đây là một tính năng hữu ích, nhưng việc giới hạn chỉ hỗ trợ mảng làm giảm khả năng sử dụng linh hoạt với các kiểu collection khác.

Đối với params trong C# 13 cho phép sử dụng với nhiều kiểu collection khác ngoài mảng. Các kiểu collection được hỗ trợ bao gồm:

– System.Span<T>

– System.ReadOnlySpan<T>

– System.Collections.Generic.IEnumerable<T> (khi có phương thức Add)

– System.Collections.Generic.IReadOnlyCollection<T>

– System.Collections.Generic.IReadOnlyList<T>

– System.Collections.Generic.ICollection<T>

– System.Collections.Generic.IList<T>

Ví dụ về params với các collection trong C# 13

Trước đây, nếu muốn sử dụng danh sách (List<T>) với params, bắt buộc phải chuyển danh sách thành mảng hoặc sử dụng params object[], dẫn đến code kém hiệu quả. Với C# 13, ta có thể truyền trực tiếp danh sách vào phương thức mà không cần chuyển đổi.

1. Sử dụng params với List<T>

void PrintNames(params List<string> names)
{
    foreach (var name in names)
    {
        Console.WriteLine(name);
    }
}
PrintNames(new List<string> { "Alice", "Bob", "Charlie" });

Trước đây, cách này không thể thực hiện được vì params không hỗ trợ danh sách.

2. Sử dụng params với Span<T>

Span<T> là một kiểu dữ liệu giúp tối ưu bộ nhớ bằng cách hoạt động trên vùng nhớ stack thay vì heap. C# 13 cho phép sử dụng params với Span<T>, giúp cải thiện hiệu suất khi làm việc với dữ liệu lớn.

void PrintValues(params Span<int> values)
{
    foreach (var value in values)
    {
        Console.WriteLine(value);
    }
}
int[] numbers = { 10, 20, 30, 40 };
PrintValues(numbers);

Khi sử dụng Span<T>, chương trình không cần tạo bản sao dữ liệu mới, giúp giảm tải bộ nhớ heap.

3. Sử dụng params với IEnumerable<T>

Trong các phiên bản trước, nếu muốn truyền một IEnumerable<T> vào phương thức, phải chuyển đổi dữ liệu thành mảng. C# 13 loại bỏ hạn chế này, giúp code linh hoạt hơn.

void DisplayItems(params IEnumerable<string> items)
{
    foreach (var item in items)
    {
        Console.WriteLine(item);
    }
}
DisplayItems(new List<string> { "A", "B", "C" });

Trước đây, nếu không chuyển đổi danh sách thành mảng, phương thức sẽ không thể biên dịch.

Lợi ích của việc mở rộng params trong C# 13

– Tăng tính linh hoạt khi làm việc với nhiều loại collection thay vì chỉ mảng.

– Cải thiện hiệu suất bằng cách hỗ trợ Span<T> và ReadOnlySpan<T>, tránh cấp phát bộ nhớ không cần thiết.

– Giúp code dễ đọc hơn, loại bỏ các bước chuyển đổi giữa các kiểu collection.

– Tối ưu hóa bộ nhớ, đặc biệt trong các ứng dụng yêu cầu hiệu suất cao như xử lý dữ liệu lớn hoặc lập trình hệ thống.

Bài viết này giúp anh em hiểu rằng, việc mở rộng params trong C# 13 thì anh em sẽ có nhiều lựa chọn hơn khi làm việc với các collection, tối ưu hiệu suất và tăng khả năng tái sử dụng mã nguồn. Đây là một cải tiến đáng chú ý, giúp việc lập trình trở nên dễ dàng hơn mà không ảnh hưởng đến hiệu suất.

#ntechdevelopers