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

C#-তে readonly এবং const কীওয়ার্ডের পার্থক্য

দ্রুত তুলনা

বিষয়constreadonly
ইনিশিয়ালাইজেশনডিক্লেয়ারেশনের সময়ে বাধ্যতামূলকডিক্লেয়ারেশন বা কনস্ট্রাক্টরে
ইভ্যালুয়েশন টাইমকম্পাইল টাইম (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 = রানটাইম কনস্ট্যান্ট (রানটাইমে রিড, কনস্ট্রাক্টর পর্যন্ত রাইট)
  1. C#-এ TrimStart() এবং TrimEnd() মেথডের পার্থক্য

  2. C#-এ const এবং readonly কীওয়ার্ডের পার্থক্য

  3. Go এবং Java-এর পার্থক্য

  4. জাভাতে volatile এবং transient কিওয়ার্ডের পার্থক্য