C# cung cấp nhiều cách lưu trữ tập hợp phần tử bao gồm mảng, ArrayList và List. Bài viết phân tích sự khác biệt giữa các cấu trúc này qua góc độ kỹ thuật.
Mảng (Array)
Mảng là cấu trúc dữ liệu cơ bản nhất trong C#, được định nghĩa trong namespace System. Mảng lưu trữ các phần tử liên tiếp trong bộ nhớ, cho phép truy xuất nhanh theo chỉ số.// Khởi tạo mảng
int[] numbers = new int[3];
// Gán giá trị
numbers[0] = 10;
numbers[1] = 20;
// Cập nhật
numbers[1] = 25;
Tuy nhiên mảng có những hạn chế:
- Kích thước cố định gây lãng phí bộ nhớ hoặc lỗi tràn khi khai báo không đúng
- Thêm/xóa phần tử giữa mảng tốn kém hiệu năng
ArrayList
Được định nghĩa trong namespace System.Collections, ArrayList giải quyết vấn đề kích thước động nhưng mang lại rủi ro về kiểu dữ liệu.using System.Collections;
// Tạo danh sách động
ArrayList dynamicList = new ArrayList();
// Thêm phần tử khác kiểu
dynamicList.Add("Xin chào");
dynamicList.Add(12345);
// Xử lý dữ liệu
dynamicList[1] = 67890;
dynamicList.Insert(0, true);
dynamicList.RemoveAt(1);
Vấn đề chính của ArrayList:
- Luôn xử lý phần tử như kiểu object dẫn đến boxing/unboxing khi làm việc với kiểu giá trị
- Rủi ro lỗi runtime do ép kiểu sai
List<T>
Được giới thiệu từ C# 2.0 trong namespace System.Collections.Generic, List<T> là phiên bản an toàn kiểu của ArrayList.using System.Collections.Generic;
// Danh sách kiểu cụ thể
List<string> stringList = new List<string>();
// Các thao tác cơ bản
stringList.Add("Element1");
stringList.Insert(0, "First");
stringList[2] = "Modified";
stringList.Remove("Element1");
Ưu điểm nổi bật:
- Kiểm tra kiểu tại thời gian biên dịch
- Tránh boxing/unboxing
- Tối ưu hiệu năng hơn ArrayList