Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

เมธอด Array.AsReadOnly<T>() ใน C#

ภาพรวม

เมธอด 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 เมื่อไม่อยากให้ผู้เรียกแก้ไขข้อมูลได้