ArrayList ক্লাসের স্ট্যাটিক ReadOnly(IList list) মেথড ব্যবহার করে একটি শুধুমাত্র পঠনযোগ্য (read-only) র্যাপার তৈরি করা যায়। এই র্যাপারের মাধ্যমে মূল ArrayList-কে মডিফাই করা যায় না (Add, Remove, Clear, Insert, সেটার ব্লকড)।
উদাহরণ ১: সাধারণ ArrayList (রিড-অনলি নয়)
using System;
using System.Collections;
public class Demo {
public static void Main() {
ArrayList list = new ArrayList();
list.Add("One");
list.Add("Two");
list.Add("Three");
list.Add("Four");
list.Add("Five");
list.Add("Six");
list.Add("Seven");
list.Add("Eight");
Console.WriteLine("ArrayList উপাদানসমূহ...");
foreach (string str in list) {
Console.WriteLine(str);
}
Console.WriteLine("ArrayList রিড-অনলি কিনা? = " + list.IsReadOnly); // False
}
}
আউটপুট
ArrayList উপাদানসমূহ... One Two Three Four Five Six Seven Eight ArrayList রিড-অনলি কিনা? = False
উদাহরণ ২: ReadOnly র্যাপার তৈরি করা
using System;
using System.Collections;
public class Demo {
public static void Main() {
ArrayList list = new ArrayList();
list.Add("One");
list.Add("Two");
list.Add("Three");
list.Add("Four");
list.Add("Five");
list.Add("Six");
list.Add("Seven");
list.Add("Eight");
Console.WriteLine("ArrayList উপাদানসমূহ...");
foreach (string str in list) {
Console.WriteLine(str);
}
Console.WriteLine("ArrayList রিড-অনলি কিনা? = " + list.IsReadOnly); // False
// Read-only র্যাপার তৈরি
ArrayList list2 = ArrayList.ReadOnly(list);
Console.WriteLine("ArrayList এখন রিড-অনলি কিনা? = " + list2.IsReadOnly); // True
// নিচের লাইনগুলো রানটাইমে NotSupportedException নিক্ষেপ করবে:
// list2.Add("Nine");
// list2.Remove("One");
// list2.Clear();
// list2[0] = "Zero";
}
}
আউটপুট
ArrayList উপাদানসমূহ... One Two Three Four Five Six Seven Eight ArrayList রিড-অনলি কিনা? = False ArrayList এখন রিড-অনলি কিনা? = True
ArrayList.ReadOnly() - গুরুত্বপূর্ণ বৈশিষ্ট্য
- রিটার্ন টাইপ:
ArrayList(সেইম টাইপ, কিন্তু IsReadOnly = true) - র্যাপার প্যাটার্ন: মূল ArrayList-কে র্যাপ করে, কপি তৈরি করে না।
- লাইভ ভিউ: মূল ArrayList পরিবর্তন হলে র্যাপারে প্রতিফলিত হয়।
- মডিফিকেশন ব্লকড: Add, Remove, Clear, Insert, RemoveAt, RemoveRange, সেটার (indexer) কল করলে
NotSupportedExceptionনিক্ষেপ করে। - পঠন অনুমত: Get, IndexOf, Contains, CopyTo, Count, foreach, GetEnumerator() কাজ করে।
রিড-অনলি কালেকশন তৈরির অন্যান্য পদ্ধতি (আধুনিক)
// ১. List + ReadOnlyCollection (সুপারিশকৃত, টাইপ-সেফ)
using System.Collections.Generic;
using System.Collections.ObjectModel;
var list = new List<string> { "One", "Two", "Three" };
var readOnlyList = new ReadOnlyCollection<string>(list);
// অথবা .NET 8+:
var readOnlyList2 = list.AsReadOnly(); // extension method
// ২. IReadOnlyList ইন্টারফেস (প্যারামিটার টাইপ হিসেবে)
void PrintList(IReadOnlyList<string> list) { ... }
// ৩. ImmutableList (System.Collections.Immutable NuGet)
using System.Collections.Immutable;
var immutableList = list.ToImmutableList(); // সম্পূর্ণ ইমিউটেবল, কপি তৈরি হয়
// ৪. Array.AsReadOnly() (T[] অ্যারের জন্য)
string[] arr = { "One", "Two", "Three" };
var readOnlyArr = Array.AsReadOnly(arr); // ReadOnlyCollection<string>
তুলনা: ArrayList.ReadOnly vs আধুনিক বিকল্প
| বৈশিষ্ট্য | ArrayList.ReadOnly() | ReadOnlyCollection<T> | ImmutableList<T> |
|---|---|---|---|
| টাইপ সেফটি | নন-জেনেরিক (object) | জেনেরিক | জেনেরিক |
| মুল কালেকশন পরিবর্তন | র্যাপারে প্রতিফলিত হয় | র্যাপারে প্রতিফলিত হয় | না (স্ন্যাপশট) |
| পারফরম্যান্স | ওভারহেড নেই | ওভারহেড নেই | কপি ওভারহেড |
| থ্রেড-সেফ | না | না (মুল লিস্ট থ্রেড-সেফ নয়) | হ্যাঁ (ইমিউটেবল) |
সুপারিশ: নতুন কোডে ArrayList এর পরিবর্তে List<T> + ReadOnlyCollection<T> বা ImmutableList<T> ব্যবহার করুন। ArrayList লিগ্যাসি নন-জেনেরিক ক্লাস।