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

Thay đổi kích thước mảng với Array.Resize trong C#


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ợpHành vi
newSize > old LengthMở rộng, phần tử mới = default(T) (0, null, false...)
newSize < old LengthCắt bớt, giữ newSize phần tử đầu
newSize == old LengthKhông làm gì (có thể tối ưu bỏ qua)
newSize < 0Né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).