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

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


C#-তে const এবং readonly উভয় কীওয়ার্ডই ইমিউটেবল (অপরিবর্তনশীল) ভ্যালু ডিফাইন করতে ব্যবহৃত হয় যেগুলো একবার ডিক্লেয়ার হলে মডিফাই করা যায় না। যাইহোক, এই দুটির মধ্যে কিছু গুরুত্বপূর্ণ পার্থক্য রয়েছে।

const

const মডিফায়ার কম্পাইল-টাইমে পরিচিত কনস্ট্যান্ট ভ্যালু ডিক্লেয়ার করে যা পরিবর্তন হয় না, অর্থাৎ তারা ইমিউটেবল। C#-তে আপনি শুধু বিল্ট-ইন টাইপগুলোকেই const চিহ্নিত করতে পারেন। ইউজার-ডিফাইনড টাইপ যেমন ক্লাস, স্ট্রাকচার ইত্যাদি const হতে পারে না। এছাড়া, ক্লাস মেম্বার টাইপ যেমন মেথড, প্রোপার্টি, বা ইভেন্ট কনস্ট্যান্ট হিসেবে চিহ্নিত করা যায় না।

আপনাকে কনস্ট্যান্টগুলো ডিক্লেয়ার করার সময়ই ইনিশিয়ালাইজ করতে হবে।

class Period{     public const int hours = 12;     public const int minutes = 60; }

কনস্ট্যান্ট যেকোনো ভিজিবিলিটি মডিফায়ারের সাথে চিহ্নিত করা যায়, অর্থাৎ private, public, protected, protected internal, বা private protected।

কনস্ট্যান্টগুলো স্ট্যাটিক ভ্যালু হিসেবে কাজ করে, অর্থাৎ ক্লাসের সব ইনস্ট্যান্সের জন্য কনস্ট্যান্টের ভ্যালু একই থাকে। আপনাকে স্পষ্টভাবে static কীওয়ার্ড দিতে হয় না। আপনি ক্লাসের ইনস্ট্যান্স ভেরিয়েবল ব্যবহার করে কনস্ট্যান্ট অ্যাক্সেস করতে পারবেন না, ক্লাস নাম ব্যবহার করতে হবে।

readonly

readonly চিহ্নিত একটি ফিল্ড শুধু ডিক্লেয়ার করার সময় বা কনস্ট্রাক্টরে অ্যাসাইন করা যায়। একবার ক্লাসের ইনস্ট্যান্স তৈরি হলে, আপনি readonly ফিল্ড মডিফাই করতে পারবেন না।

যদি ফিল্ডটি একটি ভ্যালু টাইপ হয়, readonly চিহ্নিত করলে সেটি ইমিউটেবল হয়। অন্যদিকে, যদি একটি readonly ফিল্ড রেফারেন্স টাইপ হয়, তবে আপনি ভেরিয়েবল দ্বারা রেফারেন্স করা অবজেক্টের ডেটা পরিবর্তন করতে পারেন। কিন্তু আপনি সেই রেফারেন্সকে একটি নতুন অবজেক্টের দিকে পয়েন্ট করতে পারবেন না।

class Person{     private readonly string _title;     private readonly string _skill;     public Person(string title, string skill){         _title = title;         _skill = skill;     } }

একটি readonly ফিল্ড ফিল্ড ডিক্লেয়ারেশন এবং যেকোনো কনস্ট্রাক্টরে একাধিকবার অ্যাসাইন করা যায়। এছাড়া, কোন কনস্ট্রাক্টর ব্যবহার করা হয়েছে তার উপর নির্ভর করে এর ভিন্ন ভ্যালু হতে পারে।

একটি গুরুত্বপূর্ণ পার্থক্য হলো যখন একটি অ্যাসেম্বলিতে ডিক্লেয়ার করা const বা readonly ফিল্ড অন্য অ্যাসেম্বলিতে ব্যবহার করার সময় কম্পাইল হয়।

  • const ভ্যালুর ক্ষেত্রে, এটি একটি ফাইন্ড-রিপ্লেসের মতো। কনস্ট্যান্ট ভ্যালু দ্বিতীয় অ্যাসেম্বলির ইন্টারমিডিয়েট ল্যাঙ্গুয়েজে 'বেকড ইন' হয়ে যায়। এর মানে যদি আপনি কনস্ট্যান্ট আপডেট করেন, দ্বিতীয় অ্যাসেম্বলিটি রিকম্পাইল না করার পর্যন্ত পুরনো ভ্যালুই থাকবে।

  • readonly ভ্যালুর ক্ষেত্রে, এটি একটি মেমরি লোকেশনের রেফারেন্সের মতো। ভ্যালু দ্বিতীয় অ্যাসেম্বলির ইন্টারমিডিয়েট ল্যাঙ্গুয়েজে বেকড ইন হয় না। এর মানে যদি মেমরি লোকেশন আপডেট হয়, দ্বিতীয় অ্যাসেম্বলি রিকম্পাইল ছাড়াই নতুন ভ্যালু পাবে। Readonly ফিল্ড আপডেট মানে শুধু প্রথম অ্যাসেম্বলি রিকম্পাইল করলেই হবে, কোনো ইউজার অ্যাসেম্বলি রিকম্পাইল করতে হবে না।

উদাহরণ

using System; class Program{     static void Main(){         Console.WriteLine(Period.HOURS);         var person = new Person("John", "Programmer");         person.Print();     } } class Period{     public const int HOURS = 12;     public const int MINUTES = 60; } class Person{     private readonly string _title;     private readonly string _skill;     public Person(string title, string skill){         _title = title;         _skill = skill;     }     public void Change(string skill){         // Error: A readonly field cannot be assigned to         // this._skill = skill;     }     public void Print(){         Console.WriteLine($"{_title}: {_skill}");     } }

আউটপুট

12 John: Programmer
  1. C++-এ const int*, const int* const, int const* পার্থক্য

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

  3. C#-এ ইন্টারফেস (Interface) এবং ক্লাস (Class) এর পার্থক্য

  4. C#-এ String (ক্লাস) এবং string (এলিয়াস) এর পার্থক্য