c# - স্ট্যাটিক পঠন বনাম Const
constants (10)
কনস্টেবল: কনস্টেবল কিছুই "ধ্রুবক" নয়, একটি পরিবর্তনশীল যার মানটি ধ্রুবক কিন্তু কম্পাইল সময়। এবং এটি একটি মান বরাদ্দ বাধ্যতামূলক। ডিফল্টরূপে একটি কনস্ট স্ট্যাটিক এবং আমরা সমগ্র প্রোগ্রাম জুড়ে একটি কনস্টেবল পরিবর্তনশীল মান পরিবর্তন করতে পারবেন না।
স্ট্যাটিক পঠনযোগ্য: একটি স্ট্যাটিক রিডোনলি টাইপ ভেরিয়েবলের মান রানটাইম এ নির্ধারণ করা যেতে পারে বা কম্পাইল সময় এ বরাদ্দ করা যেতে পারে এবং রানটাইম এ পরিবর্তিত হতে পারে। কিন্তু এই পরিবর্তনশীল এর মান স্ট্যাটিক কনস্ট্রাক্টারে শুধুমাত্র পরিবর্তন করা যেতে পারে। এবং আরও পরিবর্তন করা যাবে না। এটি রানটাইম এ শুধুমাত্র একবার পরিবর্তন করতে পারেন
রেফারেন্স: c-sharpcorner
আমি const
এবং static readonly
ক্ষেত্র প্রায় চারপাশে পড়া করেছি। আমরা কিছু ক্লাস যা শুধুমাত্র ধ্রুবক মান রয়েছে। আমাদের সিস্টেমের চারপাশে বিভিন্ন জিনিস জন্য ব্যবহৃত। তাই আমি আমার পর্যবেক্ষণ সঠিক কিনা ভাবছি:
এই ধরনের ধ্রুবক মান সর্বদা সর্বজনীন জন্য static readonly
? এবং শুধুমাত্র অভ্যন্তরীণ / সুরক্ষিত / ব্যক্তিগত মান জন্য const
ব্যবহার করুন?
আপনি কি সুপারিশ করেন? আমি এমনকি static readonly
ক্ষেত্র ব্যবহার করা উচিত নয়, বরং বৈশিষ্ট্যের ব্যবহার সম্ভবত?
C # মধ্যে ন্যস্ত এবং স্ট্যাটিক readonly ক্ষেত্রের মধ্যে একটি ছোটখাট পার্থক্য আছে। নেট
গণিত কম্পাইল সময় মান সঙ্গে শুরু করা আবশ্যক।
const ডিফল্ট স্ট্যাটিক দ্বারা এবং ধ্রুবক মান দিয়ে শুরু করা প্রয়োজন, যা পরবর্তীতে সংশোধন করা যাবে না। এটি সব ডাটাটাইপ দিয়ে ব্যবহার করা যাবে না। প্রাক্তন তারিখের জন্য। এটি DateTime ডেটাটাইপ দিয়ে ব্যবহার করা যাবে না।
public const DateTime dt = DateTime.Today; //throws compilation error
public const string Name = string.Empty; //throws compilation error
public static readonly string Name = string.Empty; //No error, legal
পঠনযোগ্য স্ট্যাটিক হিসাবে ঘোষণা করা যেতে পারে, কিন্তু প্রয়োজনীয় নয়। ঘোষণার সময় শুরু করার প্রয়োজন নেই। তার মান একবার কনস্ট্রাকটর ব্যবহার করে বরাদ্দ করা বা পরিবর্তন করা যেতে পারে। সুতরাং একবার পাঠযোগ্য ক্ষেত্রের মান পরিবর্তন করার সম্ভাবনা আছে (কোন ব্যাপার না, যদি এটি স্ট্যাটিক না হয়), যা কনস্টেক্সের সাথে সম্ভব নয়।
অন্য সমাহারগুলিতে প্রকাশ করার পরে একটি স্থিতিশীল পঠনযোগ্য ক্ষেত্র উপকারী হয় যা পরবর্তী সংস্করণে পরিবর্তিত হতে পারে।
উদাহরণস্বরূপ, অনুমান করুন অ্যাসেম্বল X
নিম্নরূপ একটি ধ্রুবক প্রকাশ করে:
public const decimal ProgramVersion = 2.3;
যদি সমাবেশ Y
রেফারেন্স করে এবং এই ধ্রুবকটি ব্যবহার করে তবে সংকলন করার সময় মান 2.3 এ বেকড হবে। এর মানে হল যে যদি X
পরবর্তী ধ্রুবক সেটের সাথে 2.4 তে পুনরায় কম্পাইল করা হয় তবে Y
পুনঃ কম্পাইল হওয়া পর্যন্ত এখনও 2.3 এর পুরানো মানটি ব্যবহার করবে। একটি স্ট্যাটিক readonly ক্ষেত্র এই সমস্যা এড়ানো।
এটি দেখার আরেকটি উপায় হল যে ভবিষ্যতে যে কোনও মান পরিবর্তিত হতে পারে তা সংজ্ঞা দ্বারা ধ্রুবক নয়, এবং তাই এক হিসাবে উপস্থাপিত করা উচিত নয়।
এটি শুধু অন্য উত্তরের একটি পরিপূরক। আমি তাদের পুনরাবৃত্তি করব না (এখন চার বছর পরে)।
এমন পরিস্থিতি রয়েছে যেখানে একটি const
এবং একটি অ-কনস্টেপ রয়েছে বিভিন্ন শব্দবিজ্ঞান। উদাহরণ স্বরূপ:
const int y = 42;
static void Main()
{
short x = 42;
Console.WriteLine(x.Equals(y));
}
প্রিন্ট আউট True
, যখন:
static readonly int y = 42;
static void Main()
{
short x = 42;
Console.WriteLine(x.Equals(y));
}
False
লিখেছেন।
কারণ x.Equals
পদ্ধতিতে দুটি ওভারলোড রয়েছে, এটি একটি short
( System.Int16
) এবং যেটি একটি object
( System.Object
) নেয়। এখন প্রশ্ন হল আমার বা উভয়ের সাথে এক বা উভয় প্রযোজ্য কিনা।
যখন y
একটি কম্পাইল-টাইম ধ্রুবক (আক্ষরিক), const
কেস, এটি গুরুত্বপূর্ণ হয়ে যায় যে int
থেকে short
কোনও অন্তর্নিহিত রূপান্তর বিদ্যমান থাকে তবে int
একটি ধ্রুবক থাকে, এবং শর্ত থাকে যে C # কম্পাইলার যাচাই করে যে এর মানটি একটি short
পরিসীমা (যা 42
হয়)। সি # ভাষা স্পেসিফিকেশন মধ্যে অনুকূল ধ্রুবক অভিব্যক্তি রূপান্তর দেখুন। সুতরাং উভয় overloads বিবেচনা করা আছে। ওভারলোড Equals(short)
পছন্দসই (কোনও short
একটি object
, তবে সমস্ত object
short
)। সুতরাং y
short
রূপান্তর করা হয়, এবং ওভারলোড ব্যবহার করা হয়। তারপর Equals
দুটি Equals
তুলনা করে, এবং এটি true
দেয়।
যখন y
ধ্রুবক হয় না, int
থেকে short
কোন অন্তর্নিহিত রূপান্তর বিদ্যমান থাকে। যেহেতু সাধারণত একটি int
একটি short
মধ্যে মাপসই করা খুব বিশাল হতে পারে। (একটি সুস্পষ্ট রূপান্তর বিদ্যমান থাকে, তবে আমি Equals((short)y)
বলি নি, তাই এটি প্রাসঙ্গিক নয়।) আমরা দেখি যে শুধুমাত্র একটি ওভারলোড প্রয়োগ করা হয়, Equals(object)
এক। তাই y
object
অবরুদ্ধ করা হয়। তারপর Equals
একটি System.Int16
একটি System.Int16
তুলনা করতে যাচ্ছে, এবং রান-টাইম ধরনের এমনকি একমত না, যেহেতু false
System.Int32
হবে।
আমরা উপসংহারে পৌঁছেছি যে কিছু (বিরল) ক্ষেত্রে, একটি const
টাইপ সদস্যকে static readonly
ক্ষেত্র (অথবা অন্য উপায়, যখন এটি সম্ভব হয়) পরিবর্তন করে প্রোগ্রামটির আচরণ পরিবর্তন করতে পারে।
কিছু অন্যান্য জিনিস
কন int int একটি
- শুরু করা আবশ্যক
- আরম্ভ কম্পাইল সময় হতে হবে
readonly int একটি
- প্রারম্ভিক ছাড়া, ডিফল্ট মান ব্যবহার করতে পারেন
- প্রবর্তন রান সময় হতে পারে
নোট করার এক জিনিস হল কনস্টিমেটিক / মান প্রকারের জন্য সীমাবদ্ধ (ব্যতিক্রম স্ট্রিং হচ্ছে)
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);
}
এটা মনে রাখা আকর্ষণীয় যে কনস্টেবল সদস্যরা সর্বদা স্থিতিশীল, তবে একটি পাঠযোগ্য সদস্য নিয়মিত ক্ষেত্রের মত স্ট্যাটিক বা নাও হতে পারে।
এই দুটি উদ্দেশ্যগুলির জন্য একটি একক শব্দ ব্যবহার করা সম্ভব, তবে এটি সংস্করণ সমস্যা বা কর্মক্ষমতা সমস্যাগুলির দিকে পরিচালিত করে। একটি মুহূর্তের জন্য অনুমান করুন যে আমরা এই (const) এবং একটি বিকাশকারীর জন্য একটি একক কীওয়ার্ড ব্যবহার করে লিখেছি:
public class A
{
public static const C = 0;
}
এবং একটি ভিন্ন বিকাশকারী একটি কোড লিখেছেন যা A:
public class B
{
static void Main() => Console.WriteLine(A.C);
}
এখন, যে কোডটি তৈরি হয় সেটি নির্ভর করে যে এসি একটি কম্পাইল-সময় ধ্রুবক? আচ্ছা, এসি ব্যবহার করা সহজভাবে মান 0 দ্বারা প্রতিস্থাপিত করা যাবে? যদি আপনি এইটিকে "হ্যাঁ" বলে থাকেন তবে এর মানে হল যে এ বিকাশকারী এসিটি যেভাবে শুরু হয়েছে তা পরিবর্তন করতে পারে না - এটি অনুমতি ছাড়াই বিকাশকারীর হাতগুলির সাথে সম্পর্কযুক্ত।
যদি আপনি এই প্রশ্নের "না" বলে থাকেন তবে একটি গুরুত্বপূর্ণ অপ্টিমাইজেশান মিস করা হয়। সম্ভবত লেখক A হল ইতিবাচক যে এসি সর্বদা শূন্য হবে। কনস্টেবল এবং পঠন উভয়ের ব্যবহারটি এটিকে বিকাশকারীকে উদ্দেশ্যটি নির্দিষ্ট করার অনুমতি দেয়। এই ভাল সংস্করণ আচরণ এবং আরও ভাল কর্মক্ষমতা জন্য তোলে।
public static readonly
ক্ষেত্র একটু অস্বাভাবিক; public static
বৈশিষ্ট্য (শুধুমাত্র একটি get
) আরো সাধারণ হবে (সম্ভবত একটি private static readonly
ক্ষেত্র দ্বারা সমর্থিত)।
const
মান সরাসরি কল-সাইটে প্রবেশ করা হয়; এটি দ্বিগুণ
- মানটি রানটাইম এ আনতে গেলে, এটি কনফিগার থেকে নেওয়া হয় না
- যদি আপনি একটি কনস্ট্যান্টের মান পরিবর্তন করেন তবে আপনাকে সমস্ত ক্লায়েন্ট পুনর্নির্মাণ করতে হবে
- কিন্তু এটি দ্রুত হতে পারে, এটি একটি পদ্ধতি কল এড়ানো হয় ...
- ... যা কখনও কখনও JIT দ্বারা সাইন ইন করা হয়েছে
মানটি কখনই পরিবর্তিত হবে না , তবে কনস জরিমানা হয় - Zero
ইত্যাদি যুক্তিসঙ্গত সংখ্যার তৈরি করে; p এর থেকে অন্য, static
বৈশিষ্ট্যগুলি আরও সাধারণ।
কনজিউমার একটি ভিন্ন সমাবেশে থাকলে আমি static readonly
ব্যবহার করব। দুটি ভিন্ন সমাহারগুলিতে const
এবং কনজিউমার থাকা আপনার পায়ে নিজেকে অঙ্কুর করার একটি দুর্দান্ত উপায়।
কনস্টেবল : কনস্টেবল ভেরিয়েবল মানগুলি ঘোষণার সাথে সংজ্ঞায়িত করতে হবে এবং তারপরে এটি পরিবর্তন হবে না। কনস্টেবল নিরবচ্ছিন্নভাবে স্ট্যাটিক তাই ক্লাস অবজেক্ট তৈরি ছাড়া আমরা তাদের অ্যাক্সেস করতে পারেন। এই কম্পাইল সময় একটি মান আছে
ReadOnly : পঠনযোগ্য রূপান্তর মান আমরা রানটাইম এ কন্সট্রাকটর ব্যবহার করার সাথে সাথে সংজ্ঞায়িত করতে পারেন। পঠনযোগ্য ভেরিয়েবল ক্লাস দৃষ্টান্ত ছাড়া অ্যাক্সেস করতে পারেন।
স্ট্যাটিক পঠনযোগ্য : স্ট্যাটিক পডনলিও ভেরিয়েবল মান আমরা স্ট্যাটিক কন্সট্রাকটরের মাধ্যমে ঘোষণার সময় সংজ্ঞায়িত করতে পারি তবে অন্য যেকোনো কনস্ট্রাক্টর.these ভেরিয়েবলের সাথে আমরা ক্লাস ক্লাসের তৈরি না করেও অ্যাক্সেস করতে পারি (স্ট্যাটিক ভেরিয়েবল হিসাবে)।
স্ট্যাটিক পঠনযোগ্যভাবে যদি আমরা বিভিন্ন সমাহারগুলির ভেরিয়েবলগুলি উপভোগ করতে পারি তবে ভাল পছন্দ হবে। অনুগ্রহ করে নীচের লিঙ্কে পূর্ণ বিবরণটি পরীক্ষা করুন
https://www.stum.de/2009/01/14/const-strings-a-very-convenient-way-to-shoot-yourself-in-the-foot/