ภาพรวม
เมธอด Array.AsReadOnly<T>() ใน C# ใช้สร้าง wrapper แบบอ่านอย่างเดียว (read-only wrapper) สำหรับอาร์เรย์ที่ระบุ ผลลัพธ์ที่ได้คือ ReadOnlyCollection<T> ซึ่งป้องกันไม่ให้แก้ไขเนื้อหาของอาร์เรย์ต้นทางผ่าน wrapper นี้
ไวยากรณ์
public static System.Collections.ObjectModel.ReadOnlyCollection<T> AsReadOnly<T>(T[] array);
พารามิเตอร์
- T - ชนิดข้อมูลขององค์ประกอบในอาร์เรย์
- array - อาร์เรย์มิติเดียว (one-dimensional) ที่ใช้ดัชนีเริ่มจาก 0 (zero-based)
ตัวอย่างการใช้งาน
using System;
using System.Collections.Generic;
public class Demo
{
public static void Main()
{
String[] arr = { "John", "Tom", "Katie", "Brad" };
// สร้าง wrapper แบบอ่านอย่างเดียว
IList list = Array.AsReadOnly(arr);
// แสดงค่าเริ่มต้น
Console.WriteLine("Read-only IList เริ่มต้น...");
Display(list);
// พยายามเปลี่ยนค่าใน wrapper (จะล้มเหลว)
try
{
list[0] = "Kevin";
list[1] = "Bradley";
}
catch (NotSupportedException e)
{
Console.WriteLine(e.GetType());
Console.WriteLine(e.Message);
Console.WriteLine();
}
Console.WriteLine("หลังพยายามเปลี่ยน 2 องค์ประกอบ IList ยังคงเดิมเพราะเป็น read-only...");
Display(list);
}
public static void Display(IList list)
{
for (int i = 0; i < list.Count; i++)
Console.WriteLine(list[i]);
Console.WriteLine();
}
} ผลลัพธ์
Read-only IList เริ่มต้น... John Tom Katie Brad System.NotSupportedException Collection is read-only. หลังพยายามเปลี่ยน 2 องค์ประกอบ IList ยังคงเดิมเพราะเป็น read-only... John Tom Katie Brad
ข้อสังเกตสำคัญ
ReadOnlyCollection<T>ไม่ใช่การสร้างสำเนาของอาร์เรย์ แต่เป็น view แบบอ่านอย่างเดียวของอาร์เรย์เดิม- การเปลี่ยนแปลงอาร์เรย์ต้นทางจะสะท้อนใน wrapper (เพราะอ้างอิงข้อมูลเดียวกัน)
- พยายามแก้ไขผ่าน wrapper จะโยน
NotSupportedException - เหมาะสำหรับส่งค่ากลับจากเมธอดหรือ property เมื่อไม่อยากให้ผู้เรียกแก้ไขข้อมูลได้