const मॉडिफायर को ऐसे किसी भी फील्ड पर लगाया जा सकता है (और सामान्यतः लगाना चाहिए) जिसकी वैल्यू कंपाइल समय पर ही पता होती है और प्रोग्राम के जीवनकाल में नहीं बदलती।
private const int num = 1729;
public const string title = "Grand" + " Master";
readonly मॉडिफायर को ऐसे किसी भी फील्ड पर लगाया जा सकता है (और सामान्यतः लगाना चाहिए) जिसे const नहीं बनाया जा सकता और जिसकी वैल्यू प्रोग्राम के जीवनकाल में नहीं बदलती। ऐसी वैल्यू या तो इनलाइन इनिशलाइज़र से सेट होती है, या इंस्टैंशिएशन के समय (कंस्ट्रक्टर से, या कंस्ट्रक्टर द्वारा कॉल किए गए किसी मेथड से)।
private readonly int num;
private readonly System.Random rand = new System.Random();
public MyClass(int num)
{
this.num = num;
}
सुरक्षा की दृष्टि से संवेदनशील स्थितियों में, या सिर्फ किसी बड़े कोडबेस पर भी जहाँ डेवलपरों की प्राथमिकताएँ और लक्ष्य अलग-अलग होते हैं, आपको कोशिश करनी चाहिए कि किसी क्लास के पब्लिक API का रास्ता बाहर से न काटा जा सके। ऐसा दो तरीकों से हो सकता है: किसी मेथड के म्यूटेबल पैरामीटर लेकर उन्हें संग्रहीत कर लेना, या किसी क्लास के म्यूटेबल मेंबर को रिटर्न वैल्यू के द्वारा या out पैरामीटर के रूप में बाहर निकाल देना।
readonly मॉडिफायर किसी फील्ड की वैल्यू या रेफरेंस को दोबारा लिखे जाने से रोक तो देता है, लेकिन रेफरेंस टाइप के मेंबरों की कोई सुरक्षा नहीं देता।
readonly List<int> ints = new List<int>();
void Foo()
{
ints.Add(1); // ok
ints = new List<int>(); // fails to compile
}
रेफरेंस टाइप के सभी मेंबरों को सुरक्षित रखने के लिए फील्डों को readonly बनाया जा सकता है और ऑटोमैटिक प्रॉपर्टी को set एक्सेसर के बिना बनाया जा सकता है।
बेस क्लास लाइब्रेरी (BCL) कलेक्शन के कुछ रीडओनली रूप देती है, जहाँ कलेक्शन के मेंबरों को अपडेट होने से रोकना ज़रूरी होता है। ये रैपर के रूप में आते हैं:
ReadOnlyDictionary<T> किसी Dictionary<T> को रीडओनली रूप में उपलब्ध कराता है।ReadOnlyCollection<T> किसी List<T> को रीडओनली रूप में उपलब्ध कराता है।आपने पिछली बार developer-privileges में जिस ऑथेंटिकेशन सिस्टम को देखा था, उस पर अब कुछ ध्यान देने की ज़रूरत है। आपको इस कोड को साफ-सुथरा करना है। ऐसा सफाई का काम आने वाले मेंटेनरों का काम तो आसान बनाएगा ही, साथ ही कुछ सुरक्षा कमजोरियों को भी सामने लाएगा और उन्हें ठीक करेगा।
const बनाइएयह एक रिफैक्टरिंग का काम है। Authenticator या Identity के जिन भी मेंबरों को आप उपयुक्त समझें, उनमें const मॉडिफायर जोड़िए।
readonly बनाइएयह एक रिफैक्टरिंग का काम है। Authenticator क्लास या Identity स्ट्रक्चर के जिन भी फील्ड को आप उपयुक्त समझें, उनमें readonly मॉडिफायर जोड़िए।
Authenticator क्लास या Identity स्ट्रक्चर की जो भी प्रॉपर्टी उपयुक्त लगे, उसका set एक्सेसर हटाइए या उसे private बनाइए।
अभी Admin को कॉल करने पर एडमिन आइडेंटिटी फील्ड मिलता है। यह ठीक नहीं है, क्योंकि कॉल करने वाला इस फील्ड को बदल सकता है। कोई ऐसा तरीका खोजिए जिससे कॉल करने वाला Authenticator ऑब्जेक्ट पर एडमिन का विवरण न बदल सके।
अभी हार्ड कोड किए गए विशेषाधिकार प्राप्त डेवलपर आइडेंटिटी वाली डिक्शनरी GetDevelopers() को कॉल करने पर मिलती है। यह ठीक नहीं है, क्योंकि कॉल करने वाला डिक्शनरी को बदल सकता है। कोई ऐसा तरीका खोजिए जिससे कॉल करने वाला Authenticator ऑब्जेक्ट पर डेवलपरों का विवरण न बदल सके।
Exercism पर साइन अप कीजिए और C# को 62 कॉन्सेप्ट178 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।