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

Kiểm tra ArrayList có chỉ đọc (read-only) trong C#

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.