C#-এ অ্যারে `const` হতে পারে না কারণ অ্যারে রেফারেন্স টাইপ এবং `const` কামপাইল-টাইম কনস্ট্যান্ট। পরিবর্তে `readonly` বা `ReadOnlyCollection<T>` ব্যবহার করতে হয়।
পদ্ধতি ১: static readonly (সর্বাধিক সাধারণ)
public static readonly string[] Vehicles = { "Car", "Motorbike", "Cab" };
- রানটাইমে একবার ইনিশিয়ালাইজ হয় (স্ট্যাটিক কনস্ট্রাক্টরে বা ফিল্ড ইনিশিয়ালাইজার দিয়ে)
- রেফারেন্স অপরিবর্তনীয়, কিন্তু অ্যারের উপাদানগুলো মিউটেবল (বদলানো যায়)
পদ্ধতি ২: ReadOnlyCollection<T> (ট্রু ইমমিউটেবিলিটি)
using System.Collections.ObjectModel;
public static readonly ReadOnlyCollection<string> Vehicles =
new ReadOnlyCollection<string>(new[] { "Car", "Motorbike", "Cab" });
- উপাদানগুলোও পরিবর্তন করা যায় না (রানটাইম এক্সেপশন থ্রো করবে)
- রিটার্ন টাইপ `IReadOnlyList<T>` ব্যবহার করা ভালো (ইন্টারফেস এক্সপোজ)
পদ্ধতি ৩: C# 6.0+ Expression-bodied Property (লেজি ইনিশিয়ালাইজেশন)
public static IReadOnlyList<string> Vehicles =>
new[] { "Car", "Motorbike", "Cab" }.ToList().AsReadOnly();
পদ্ধতি ৪: C# 9.0+ Init-only Property (আধুনিক)
public class Config
{
public IReadOnlyList<string> Vehicles { get; init; } =
new[] { "Car", "Motorbike", "Cab" };
}
পদ্ধতি ৫: FrozenSet / FrozenDictionary (.NET 8+)
// .NET 8+ - অপ্টিমাইজড রিড-ওনلی কালেকশন
using System.Collections.Frozen;
public static readonly FrozenSet<string> Vehicles =
new[] { "Car", "Motorbike", "Cab" }.ToFrozenSet();
তুলনামূলক সারসংক্ষেপ
| পদ্ধতি | ইমমিউটেবল? | লেজি? | পারফরম্যান্স | C# ভার্সন |
| static readonly T[] | না (রেফারেন্স মাত্র) | না | দ্রুততম | ১.০+ |
| ReadOnlyCollection<T> | হ্যাঁ (রানটাইম চেক) | না | দ্রুত | ২.০+ |
| IReadOnlyList<T> + ToList().AsReadOnly() | হ্যাঁ | হ্যাঁ (প্রোপার্টি) | মাঝারি | ৬.০+ |
| FrozenSet/FrozenDictionary | হ্যাঁ (অপ্টিমাইজড) | না | রিড-হেভি ওয়ার্কলোডে দ্রুততম | ৮.০+ |
বেস্ট প্র্যাক্টিস: ইন্টারফেস এক্সপোজ করুন
// ভালো: ইন্টারফেস রিটার্ন করুন, কনক্রিট টাইপ না
public static IReadOnlyList<string> Vehicles { get; } =
new[] { "Car", "Motorbike", "Cab" }.ToList().AsReadOnly();
// কলার সাইডে
foreach (var v in Config.Vehicles) { } // IList, ICollection মেথড নেই
// Config.Vehicles.Add("Bus"); // কম্পাইল এরর!
Const vs Readonly পার্থক্য
| ফিচার | const | readonly |
| ইনিশিয়ালাইজেশন | কামপাইল-টাইম | রানটাইম (কনস্ট্রাক্টর/ফিল্ড ইনিশিয়ালাইজার) |
| টাইপ | প্রিমিটিভ + string + null | যেকোনো টাইপ (অ্যারে, অবজেক্ট, লিস্ট) |
| স্ট্যাটিক | নেইম্পলিসিট স্ট্যাটিক | ইনস্ট্যান্স বা স্ট্যাটিক হতে পারে |
| অ্যারে সাপোর্ট | না | হ্যাঁ |
উদাহরণ: কনফিগারেশন ক্লাস
public static class AppConfig
{
// কম্পাইল-টাইম কনস্ট্যান্ট
public const string AppName = "MyApp";
public const int MaxRetries = 3;
// রানটাইম কনস্ট্যান্ট (অ্যারে, লিস্ট, ডিকশনারি)
public static readonly IReadOnlyList<string> AllowedExtensions =
new[] { ".txt", ".json", ".xml" }.ToList().AsReadOnly();
public static readonly IReadOnlyDictionary<string, string> DefaultSettings =
new Dictionary<string, string>
{
{ "Theme", "Dark" },
{ "Language", "bn-BD" }
}.AsReadOnly(); // Dictionary.AsReadOnly() .NET 6+ এ উপলব্ধ
}