Giới thiệu
Thuộc tính IsReadOnly của ArrayList luôn trả về false vì ArrayList mặc định cho phép thêm, xóa, sửa phần tử. Có thể tạo wrapper chỉ đọc bằng ArrayList.ReadOnly().
Ví dụ 1: Kiểm tra các thuộc tính của ArrayList và wrapper
using System;
using System.Collections;
public class Demo
{
public static void Main(String[] args)
{
ArrayList list1 = new ArrayList();
list1.Add("ABC");
list1.Add("BCD");
list1.Add("CDE");
list1.Add("DEF");
list1.Add("EFG");
list1.Add("GHI");
list1.Add("HIJ");
list1.Add("IJK");
list1.Add("JKL");
list1.Add("KLM");
Console.WriteLine("Elements in ArrayList...");
foreach (string res in list1)
{
Console.WriteLine(res);
}
ArrayList list = ArrayList.Synchronized(list1);
Console.WriteLine("Is ArrayList synchronized? = " + list.IsSynchronized);
ArrayList list2 = ArrayList.FixedSize(list1);
Console.WriteLine("Is ArrayList have a fixed size? = " + list2.IsFixedSize);
Console.WriteLine("Is the ArrayList read-only? = " + list1.IsReadOnly);
}
}
Kết quả
Elements in ArrayList... ABC BCD CDE DEF EFG GHI HIJ IJK JKL KLM Is ArrayList synchronized? = True Is ArrayList have a fixed size? = True Is the ArrayList read-only? = False
Ví dụ 2: Kiểm tra IsReadOnly trên hai ArrayList thường
using System;
using System.Collections;
public class Demo
{
public static void Main(String[] args)
{
ArrayList list1 = new ArrayList();
list1.Add("A");
list1.Add("B");
list1.Add("C");
list1.Add("D");
list1.Add("E");
list1.Add("F");
Console.WriteLine("Elements in ArrayList1...");
foreach (string res in list1)
{
Console.WriteLine(res);
}
Console.WriteLine("Is ArrayList1 synchronized? = " + list1.IsSynchronized);
Console.WriteLine("Is the ArrayList1 read-only? = " + list1.IsReadOnly);
ArrayList list2 = new ArrayList();
list2.Add("A");
list2.Add("B");
list2.Add("C");
list2.Add("D");
list2.Add("E");
list2.Add("F");
Console.WriteLine("Elements in ArrayList2...");
foreach (string res in list2)
{
Console.WriteLine(res);
}
Console.WriteLine("Is ArrayList synchronized? = " + list2.IsSynchronized);
Console.WriteLine("Is the ArrayList2 read-only? = " + list2.IsReadOnly);
}
}
Kết quả
Elements in ArrayList1... A B C D E F Is ArrayList1 synchronized? = False Is the ArrayList1 read-only? = False Elements in ArrayList2... A B C D E F Is ArrayList synchronized? = False Is the ArrayList2 read-only? = False
Tạo ArrayList chỉ đọc (ReadOnly Wrapper)
ArrayList original = new ArrayList();
original.Add("A");
original.Add("B");
ArrayList readOnly = ArrayList.ReadOnly(original);
Console.WriteLine(readOnly.IsReadOnly); // True
// readOnly.Add("C"); // Ném NotSupportedException
// Ghi chú: ReadOnly wrapper vẫn phản ánh thay đổi của original
original.Add("C");
Console.WriteLine(readOnly.Count); // 3
So sánh các wrapper
| Wrapper | IsReadOnly | IsFixedSize | IsSynchronized |
|---|---|---|---|
| ArrayList gốc | false | false | false |
| ArrayList.ReadOnly() | true | true | false |
| ArrayList.FixedSize() | false | true | false |
| ArrayList.Synchronized() | false | false | true |
Khuyến nghị hiện đại
Thay vì ArrayList, hãy dùng List<T> kết hợp với ImmutableList<T> (read-only thật sự) hoặc IReadOnlyList<T> interface.