দ্রুত তুলনা
| বিষয় | const | readonly |
| ইনিশিয়ালাইজেশন | ডিক্লেয়ারেশনের সময়ে বাধ্যতামূলক | ডিক্লেয়ারেশন বা কনস্ট্রাক্টরে |
| ইভ্যালুয়েশন টাইম | কম্পাইল টাইম (Constant) | রানটাইম (Read-only field) |
| মান পরিবর্তন | কभी সম্ভব নয় | কনস্ট্রাক্টর পর্যন্ত পরিবর্তনযোগ্য |
| স্ট্যাটিক? | ইম্প্লিসিটলি static | ইনস্ট্যান্স বা স্ট্যাটিক (ইচ্ছামতো) |
| মেথড ভিতরে | হ্যাঁ (local const) | না (ফিল্ড হওয়া বাধ্যতামূলক) |
| অ্যাট্রিবিউট আর্গুমেন্ট | হ্যাঁ | না |
| switch case label | হ্যাঁ | না |
| enum underlying type | হ্যাঁ | না |
const উদাহরণ
public class Constants {
// কম্পাইল টাইম কনস্ট্যান্ট
public const double PI = 3.14159265359;
public const int MaxUsers = 100;
public const string AppName = "MyApp";
// এক্সপ্রেশন (কম্পাইল টাইমে রিজল্ভ হতে হবে)
public const long FileSizeLimit = 1024 * 1024 * 100; // 100 MB
// মেথড ভিতরেও ডিক্লেয়ার করা যায়
public void Demo() {
const int LocalConst = 42;
Console.WriteLine(LocalConst);
}
}
readonly উদাহরণ
public class Config {
// রানটাইম কনস্ট্যান্ট — কনস্ট্রাক্টরে সেট
public readonly string ConnectionString;
public readonly int MaxRetries;
public readonly DateTime StartupTime;
// Static readonly — একবারই ইনিশিয়ালাইজ
public static readonly string Version = "1.0.0";
public Config(string env) {
// রানটাইমে ডিসাইড
ConnectionString = env == "Prod"
? "Server=prod;..."
: "Server=dev;...";
MaxRetries = env == "Prod" ? 3 : 5;
StartupTime = DateTime.UtcNow;
}
}
গুরুত্বপূর্ণ পার্থক্য: কম্পাইল টাইম vs রানটাইম
// Assembly A (Library)
public class LibConstants {
public const int MaxValue = 100;
public static readonly int MaxValue2 = 100;
}
// Assembly B (Consumer) — LibConstants রেফারেন্স করে
public class Consumer {
public void Print() {
Console.WriteLine(LibConstants.MaxValue); // 100 (বেকড হয়ে যায়!)
Console.WriteLine(LibConstants.MaxValue2); // 100 (রানটাইমে রিড)
}
}
// যদি Assembly A-তে MaxValue = 200 করে রিকম্পাইল করা হয়,
// কিন্তু Assembly B রিকম্পাইল না করা হয়:
// → MaxValue প্রিন্ট করবে 100 (পুরানো বেকড ভ্যালু!)
// → MaxValue2 প্রিন্ট করবে 200 (নতুন ভ্যালু!)
কখন কী ব্যবহার করবেন?
- const: কম্পাইল-টাইম কনস্ট্যান্ট, ম্যাথমেটিক্যাল কনস্ট্যান্ট, এনাম ভ্যালু, অ্যাট্রিবিউট প্যারামিটার, switch case
- readonly: রানটাইমে ডিটারমাইন হওয়া মান, কনফিগারেশন, ডিপেন্ডেন্সি ইনজেকশন, অবজেক্ট রেফারেন্স, বড় স্ট্রাকচার
আধুনিক বিকল্প: init-only / required (C# 9/11+)
public class Settings {
// ইনিশিয়ালাইজার-ওনলি সেট, তারপর ইমিউটেবল
public required string ApiKey { get; init; }
public required int Timeout { get; init; } = 30;
// Static readonly — সিঙ্গলটন কনস্ট্যান্ট
public static readonly Settings Default = new() {
ApiKey = "default", Timeout = 60
};
}
সারাংশ
const = কম্পাইল টাইম কনস্ট্যান্ট (বেকড হয়)
readonly = রানটাইম কনস্ট্যান্ট (রানটাইমে রিড, কনস্ট্রাক্টর পর্যন্ত রাইট)