কম্পিউটার টিউটোরিয়াল

C#-এ কনস্ট্যান্ট অ্যারে ঘোষণা করা (readonly vs const)

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 পার্থক্য

ফিচারconstreadonly
ইনিশিয়ালাইজেশনকামপাইল-টাইমরানটাইম (কনস্ট্রাক্টর/ফিল্ড ইনিশিয়ালাইজার)
টাইপপ্রিমিটিভ + 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+ এ উপলব্ধ
}
  1. C#-তে মাল্টিডাইমেনশনাল অ্যারে (Multidimensional Array)

  2. C#-এ অ্যারে কীভাবে ঘোষণা করবেন?

  3. C#-এ অ্যারে কপি (Array Copy)

  4. C#-এ অ্যারে ডিক্লেরেশন