c# - फ़ील्ड को सी#में 'रीडोनली' के रूप में चिह्नित करने के क्या फायदे हैं?




readonly (9)

सदस्य चर को केवल पढ़ने के रूप में घोषित करने के क्या फायदे हैं? क्या यह सिर्फ वर्ग के जीवन चक्र के दौरान किसी के खिलाफ बदल रहा है या इस कीवर्ड के कारण कोई संकलक गति सुधार है


इसे बहुत व्यावहारिक शर्तों में रखने के लिए:

यदि आप डीएलएल ए और डीएल बी संदर्भों में एक कॉन्स का उपयोग करते हैं, तो उस कॉन्स का मान डीएलएल बी में संकलित किया जाएगा। यदि आप उस एएस के लिए नए मान के साथ डीएल ए को पुन: नियोजित करते हैं, तो डीएल बी अभी भी मूल मान का उपयोग करेगा।

यदि आप डीएलएल ए और डीएल बी संदर्भों में केवल पढ़ने के लिए उपयोग करते हैं, तो पाठक रूप से हमेशा रनटाइम पर देखा जाएगा। इसका अर्थ यह है कि यदि आप उस पाठ के लिए नए मान के साथ डीएल ए को पुन: नियोजित करते हैं, तो डीएल बी उस नए मान का उपयोग करेगा।


एक संभावित मामला है जहां संकलक केवल पाठक कीवर्ड की उपस्थिति के आधार पर प्रदर्शन अनुकूलन कर सकता है।

यह केवल तब लागू होता है जब पाठक क्षेत्र को स्थैतिक के रूप में भी चिह्नित किया जाता है। उस स्थिति में, जेआईटी कंपाइलर यह मान सकता है कि यह स्थैतिक क्षेत्र कभी नहीं बदलेगा। कक्षा के तरीकों को संकलित करते समय जेआईटी कंपाइलर इसे ध्यान में रख सकता है।

विशिष्ट उदाहरण: आपकी कक्षा में एक स्थिर रीडोनली IsDebugLoggingEnabled फ़ील्ड हो सकता है जिसे कन्स्ट्रक्टर में प्रारंभ किया गया है (उदाहरण के लिए कॉन्फ़िगरेशन फ़ाइल के आधार पर)। एक बार जब वास्तविक विधियां जेआईटी संकलित हो जाती हैं, तो डिबग लॉगिंग सक्षम नहीं होने पर संकलक कोड के पूरे हिस्सों को छोड़ सकता है।

मैंने यह जांच नहीं की है कि क्या यह अनुकूलन वास्तव में जेआईटी कंपाइलर के वर्तमान संस्करण में लागू किया गया है, इसलिए यह केवल अटकलें है।


ध्यान रखें कि केवल पढ़ने के लिए ही मूल्य पर लागू होता है, इसलिए यदि आप संदर्भ प्रकार का उपयोग कर रहे हैं तो केवल संदर्भ को बदलने से संदर्भ की रक्षा करता है। उदाहरण की स्थिति केवल पढ़ने के द्वारा संरक्षित नहीं है।


निजी रीडोनली सरणी से सावधान रहें। यदि इन्हें क्लाइंट को ऑब्जेक्ट के रूप में उजागर किया जाता है (आप COM इंटरऑप के लिए ऐसा कर सकते हैं जैसा कि मैंने किया था) क्लाइंट सरणी मानों में हेरफेर कर सकता है। ऑब्जेक्ट के रूप में सरणी लौटने पर क्लोन () विधि का उपयोग करें।


मुझे विश्वास नहीं है कि एक पठनीय क्षेत्र का उपयोग करने से कोई प्रदर्शन लाभ है। यह सुनिश्चित करने के लिए बस एक जांच है कि एक बार ऑब्जेक्ट पूरी तरह से बनाया गया है, उस क्षेत्र को एक नए मूल्य की ओर इशारा नहीं किया जा सकता है।

हालांकि "रीडोनली" अन्य प्रकार के केवल पढ़ने वाले अर्थशास्त्र से बहुत अलग है क्योंकि इसे सीएलआर द्वारा रनटाइम पर लागू किया जाता है। रीडोनली कीवर्ड नीचे संकलित करता है जो कि सीएनआर द्वारा सत्यापित किया जाता है।

इस कीवर्ड का वास्तविक लाभ अपरिवर्तनीय डेटा संरचनाएं उत्पन्न करना है। परिभाषा के द्वारा अपरिवर्तनीय डेटा संरचनाओं को एक बार बनाया जा सकता है। यह रनटाइम पर संरचना के व्यवहार के बारे में तर्क करना बहुत आसान बनाता है। उदाहरण के लिए, कोड के किसी अन्य यादृच्छिक भाग में एक अपरिवर्तनीय संरचना को पारित करने का कोई खतरा नहीं है। वे इसे कभी भी नहीं बदल सकते हैं ताकि आप उस संरचना के खिलाफ विश्वसनीय रूप से प्रोग्राम कर सकें।

अपरिवर्तनीयता के लाभों में से एक के बारे में यहां एक अच्छी प्रविष्टि है: Threading


यदि आपके पास पूर्व परिभाषित या पूर्व गणना मूल्य है जो प्रोग्राम के माध्यम से समान रहने की आवश्यकता है तो आपको निरंतर उपयोग करना चाहिए, लेकिन यदि आपके पास एक ऐसा मूल्य है जिसे रनटाइम पर प्रदान किया जाना आवश्यक है, लेकिन एक बार असाइन किए जाने वाले कार्यक्रम में आपको एक ही रहना चाहिए सिफ़ पढ़िये। उदाहरण के लिए यदि आपको प्रोग्राम प्रारंभ समय असाइन करना है या आपको ऑब्जेक्ट प्रारंभिक पर उपयोगकर्ता द्वारा प्रदान किए गए मान को स्टोर करना होगा और आपको इसे आगे के परिवर्तनों से प्रतिबंधित करना होगा, आपको केवल पढ़ने के लिए उपयोग करना चाहिए।


हैरानी की बात है कि, वास्तव में धीरे-धीरे धीमे कोड में परिणाम हो सकता है, क्योंकि जॉन स्कीट ने अपने नोड टाइम लाइब्रेरी का परीक्षण करते समय पाया। इस मामले में, 20 सेकंड में चलने वाले एक परीक्षण को केवल पढ़ने के बाद केवल 4 सेकंड लग गए।

https://codeblog.jonskeet.uk/2014/07/16/micro-optimization-the-surprising-inefficiency-of-readonly-fields/


readonly कीवर्ड का उपयोग सदस्य चर को निरंतर घोषित करने के लिए किया जाता है, लेकिन मान को रनटाइम पर गणना करने की अनुमति देता है। यह स्थिरांक से निरंतर घोषित किया गया है, जिसमें संकलन समय पर इसका मान सेट होना चाहिए। readonly आप घोषणा के क्षेत्र में या ऑब्जेक्ट के निर्माता में फ़ील्ड का मान सेट कर सकते हैं कि फ़ील्ड का सदस्य है।

अगर आप निरंतर संदर्भित बाहरी डीएलएल को पुन: संकलित नहीं करना चाहते हैं तो इसका भी उपयोग करें (क्योंकि यह संकलन समय पर प्रतिस्थापित हो जाता है)।


readonly लिए कोई स्पष्ट प्रदर्शन लाभ नहीं है, कम से कम कोई भी जिसे मैंने कभी भी देखा है। एक बार इसे शुरू करने के बाद संशोधन को रोकने के लिए, जैसा कि आप सुझाव देते हैं, ठीक वही करने के लिए है।

तो यह फायदेमंद है कि यह आपको अधिक मजबूत, अधिक पठनीय कोड लिखने में मदद करता है। इस तरह की चीज़ों का असली लाभ तब होता है जब आप किसी टीम में या रखरखाव के लिए काम कर रहे होते हैं। कुछ readonly रूप में घोषित करना कोड में उस चर के उपयोग के लिए अनुबंध डालने जैसा है। इसके बारे में सोचें जैसे कि internal या private जैसे अन्य कीवर्ड, आप कह रहे हैं कि "यह चर प्रारंभिकरण के बाद संशोधित नहीं किया जाना चाहिए", और इसके अलावा आप इसे लागू कर रहे हैं।

इसलिए यदि आप कक्षा बनाते हैं और कुछ सदस्य चर को डिज़ाइन द्वारा readonly , तो आप स्वयं को या किसी अन्य टीम के सदस्य को बाद में गलती करते समय रोकते हैं जब वे आपकी कक्षा में विस्तार या संशोधन कर रहे हैं। मेरी राय में, यह एक लाभ है (अतिरिक्त भाषा जटिलता के छोटे खर्च पर, जैसा कि टिप्पणियों में डूफोल्डॉर्फ उल्लेख है)।





readonly