const এবং readonly অনুরূপ, কিন্তু তারা ঠিক এক নয়।
একটি constক্ষেত্রটি একটি সংকলন-সময় ধ্রুবক, যার অর্থ যে সংকলন-সময় সেই মানটি গণনা করা যায়। একটি readonlyক্ষেত্র অতিরিক্ত পরিস্থিতি সক্ষম করে যাতে টাইপটি নির্মাণের সময় কিছু কোড চালানো আবশ্যক। নির্মাণের পরে, একটি readonlyক্ষেত্র পরিবর্তন করা যাবে না।
উদাহরণস্বরূপ, constসদস্যদের যেমন সদস্যদের সংজ্ঞা দিতে ব্যবহার করা যেতে পারে:
struct Test
{
public const double Pi = 3.14;
public const int Zero = 0;
}
যেহেতু 3.14 এবং 0 এর মতো মানগুলি সংকলন-সময় ধ্রুবক। যাইহোক, আপনি যেখানে কোনও প্রকারটি সংজ্ঞায়িত করেন এবং এর প্রাক প্রাক-উদাহরণ সরবরাহ করতে চান সেই ক্ষেত্রে বিবেচনা করুন। উদাহরণস্বরূপ, আপনি একটি রঙের শ্রেণি সংজ্ঞায়িত করতে এবং কালো, সাদা ইত্যাদির মতো সাধারণ রঙগুলির জন্য "ধ্রুবকগুলি" সরবরাহ করতে চাইতে পারেন, কনস্টের সদস্যদের সাথে এটি করা সম্ভব নয়, কারণ ডান হাতের পক্ষগুলি সংকলন-সময় ধ্রুবক নয়। নিয়মিত স্থিতিশীল সদস্যদের সাথে কেউ এটি করতে পারে:
public class Color
{
public static Color Black = new Color(0, 0, 0);
public static Color White = new Color(255, 255, 255);
public static Color Red = new Color(255, 0, 0);
public static Color Green = new Color(0, 255, 0);
public static Color Blue = new Color(0, 0, 255);
private byte red, green, blue;
public Color(byte r, byte g, byte b) => (red, green, blue) = (r, g, b);
}
তবে তারপরে রঙের কোনও ক্লায়েন্টকে ম্যাকিং থেকে বিরত রাখার মতো কিছুই নেই, সম্ভবত কালো এবং সাদা মানগুলি অদলবদল করে। বলা বাহুল্য, এটি রঙ শ্রেণীর অন্যান্য ক্লায়েন্টদের জন্য কনসেন্টেশন সৃষ্টি করবে। "পঠনযোগ্য" বৈশিষ্ট্যটি এই দৃশ্যের ঠিকানা দেয়।
কেবল পরিচয় দিয়ে readonlyঘোষণাপত্রগুলিতে কীওয়ার্ডটি করার মাধ্যমে ক্লায়েন্ট কোডটিকে চারপাশে ঠাট্টা করা থেকে বিরত করার সময় আমরা নমনীয় সূচনাটি সংরক্ষণ করি।
public class Color
{
public static readonly Color Black = new Color(0, 0, 0);
public static readonly Color White = new Color(255, 255, 255);
public static readonly Color Red = new Color(255, 0, 0);
public static readonly Color Green = new Color(0, 255, 0);
public static readonly Color Blue = new Color(0, 0, 255);
private byte red, green, blue;
public Color(byte r, byte g, byte b) => (red, green, blue) = (r, g, b);
}
এটি লক্ষণীয় আকর্ষণীয় যে কনস্টের সদস্যরা সর্বদা স্থির থাকে, তবে কেবলমাত্র নিয়মিত ক্ষেত্রের মতোই কেবল পাঠযোগ্য সদস্যরা স্থির হয় বা নাও হতে পারে।
এই দুটি উদ্দেশ্যে একটি একক কীওয়ার্ড ব্যবহার করা সম্ভব তবে এটি সংস্করণে সমস্যা বা পারফরম্যান্স সমস্যার কারণ হতে পারে। এক মুহুর্তের জন্য ধরে নিন যে আমরা এই (কনস্ট্যান্ট) জন্য একটি একক কীওয়ার্ড ব্যবহার করেছি এবং একজন বিকাশকারী লিখেছেন:
public class A
{
public static const C = 0;
}
এবং অন্য বিকাশকারী কোড লিখেছেন যা এ:
public class B
{
static void Main() => Console.WriteLine(A.C);
}
এখন, উত্পন্ন কোডটি কি এসি একটি সংকলন-সময় ধ্রুবক এর উপর নির্ভর করতে পারে? অর্থাত, এসি ব্যবহারের ফলে কেবল 0 মানটি প্রতিস্থাপন করা যাবে? আপনি যদি এটিকে "হ্যাঁ" বলে থাকেন তবে তার অর্থ হ'ল এ এর বিকাশকারী এসি শুরু করার উপায়টি পরিবর্তন করতে পারে না - এটি অনুমতি ছাড়াই এ এর বিকাশকারীদের হাত বাঁধে।
আপনি যদি এই প্রশ্নের "না" বলেন তবে একটি গুরুত্বপূর্ণ অপটিমাইজেশন মিস হয়ে গেছে। সম্ভবত এ এর লেখক ইতিবাচক যে এসি সর্বদা শূন্য থাকবে। কনস্ট এবং পঠন উভয়ের ব্যবহার এ এর বিকাশকারীকে উদ্দেশ্য নির্দিষ্ট করতে দেয় allows এটি উন্নত সংস্করণ আচরণ এবং আরও ভাল কর্মক্ষমতা তৈরি করে।
static readonly: একটি কনস্টের ভিতরেIEnumeratorএমন কনস্ট ব্যবহার করার চেষ্টা করুন যা একটি অপ্রাপ্যযোগ্য ট্রিগার করতে পারেyieldএবং আপনি একটি ভয়ঙ্কর "অভ্যন্তরীণ সংকলক ত্রুটি" পেয়ে যাবেন । আমি Unity3D বাহিরে কোড পরীক্ষা করা হয়নি, কিন্তু আমি বিশ্বাস কর এটা হয় একটি হল মনো বা .NET বাগ । তবুও এটি একটি সি # ইস্যু।