Giới thiệu
Mảng trong C# có kích thước cố định (fixed-size). Array.Resize<T>(ref T[] array, int newSize) tạo mảng mới kích thước newSize, copy phần tử từ mảng cũ, và gán tham chiếu mới cho biến array (qua ref).
Ví dụ cơ bản
char[] arr = new char[5]; arr[0] = 'J'; arr[1] = 'A'; Array.Resize(ref arr, 4); // Resize xuống 4 arr[2] = 'C'; arr[3] = 'K';
Ví dụ hoàn chỉnh
using System;
class Program
{
static void Main()
{
char[] arr = new char[5];
arr[0] = 'J'; arr[1] = 'A';
Array.Resize(ref arr, 4);
arr[2] = 'C'; arr[3] = 'K';
Console.WriteLine("Updated Array: " + new string(arr));
}
}
Kết quả
Updated Array: JACK
Hành vi Resize
| Trường hợp | Hành vi |
|---|---|
| newSize > old Length | Mở rộng, phần tử mới = default(T) (0, null, false...) |
| newSize < old Length | Cắt bớt, giữ newSize phần tử đầu |
| newSize == old Length | Không làm gì (có thể tối ưu bỏ qua) |
| newSize < 0 | Ném ArgumentOutOfRangeException |
Lưu ý quan trọng
- Phải dùng
ref- phương thức thay đổi tham chiếu của biến gốc. - Tạo mảng mới -> O(n) copy, cấp phát bộ nhớ mới.
- Tham chiếu cũ đến mảng cũ vẫn giữ mảng cũ (nếu có biến khác tham chiếu).
- Không phải resize "in-place" như C++ vector.
Thay thế tốt hơn: List<T>
// Thay vì array + Resize var list = new List{ 'J', 'A' }; list.Add('C'); list.Add('K'); // Tự động mở rộng // Chuyển về array nếu cần char[] arr = list.ToArray();
Khi nào buộc dùng Array.Resize?
- API yêu cầu mảng (T[]) với kích thước chính xác.
- Interop với native code cần mảng cố định.
- Hiệu suất critical, tránh overhead List (hiếm).