Câu trả lời ngắn
Không thể resize mảng trực tiếp vì mảng C# có kích thước cố định (fixed-size) khi khởi tạo. Tuy nhiên, có thể thay thế mảng bằng mảng mới kích thước khác dùng Array.Resize<T>(ref array, newSize).
Ví dụ Array.Resize
char[] ch = new char[10]; ch[0] = 'a'; ch[1] = 'b'; Array.Resize(ref ch, 10); // Thay thế bằng mảng mới size 10 ch[2] = 'c'; ch[3] = 'd'; ... ch[9] = 'j';
Ví dụ hoàn chỉnh
using System;
class Program
{
static void Main()
{
char[] ch = new char[10];
ch[0] = 'a'; ch[1] = 'b';
Array.Resize(ref ch, 10);
for (int i = 2; i < 10; i++) ch[i] = (char)('c' + i - 2);
Console.WriteLine("New Array: " + new string(ch));
}
}
Kết quả
New Array: abcdefghij
Giải thích cơ chế
- Cấp phát mảng mới
char[newSize]. - Copy
Min(old.Length, newSize)phần tử từ mảng cũ sang mới. - Gán tham chiếu mảng mới cho biến
ch(quaref). - Mảng cũ bị GC thu gom nếu không còn tham chiếu khác.
Các phương án thay thế
| Phương án | Ưu điểm | Nhược điểm |
|---|---|---|
List<T> | Tự động mở rộng, API phong phú | Overhead nhỏ, không phải mảng |
Array.Resize | Giữ kiểu T[], tương thích API cũ | O(n) copy, cấp phát mới |
Array.Copy manual | Kiểm soát chính xác | Verbose, dễ sai |
Span/Memory (.NET Core) | Zero-allocation slice | Không thay đổi kích thước mảng gốc |
Best Practice
- Mặc định dùng
List<T>cho collection động. - Chỉ dùng Array.Resize khi bắt buộc phải có mảng (T[]).
- Tránh Resize trong vòng lặp hot path (tốn GC pressure).