सी # में 'कास्ट स्ट्रिंग' बनाम 'स्टैटिक रीडोनली स्ट्रिंग'


जवाबों:


171

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

एक static readonlyस्ट्रिंग एक सामान्य क्षेत्र है जो रनटाइम पर देखा जाता है। इसलिए, यदि किसी भिन्न असेंबली में फ़ील्ड का मान बदल जाता है, तो असेंबली को लोड किए बिना, जैसे ही पुन: लोड किया जाएगा, परिवर्तन दिखाई देगा।

इसका मतलब यह भी है कि एक static readonlyस्ट्रिंग गैर-स्थिर सदस्यों का उपयोग कर सकती है, जैसे कि Environment.UserNameया DateTime.Now.ToString()। एक constस्ट्रिंग को केवल अन्य स्थिरांक या शाब्दिक का उपयोग करके आरंभ किया जा सकता है।
इसके अलावा, एक static readonlyस्ट्रिंग को स्थिर निर्माता में सेट किया जा सकता है; एक constस्ट्रिंग को केवल प्रारंभिक इनलाइन किया जा सकता है।

ध्यान दें कि static stringसंशोधित किया जा सकता है; आपको static readonlyइसके बजाय उपयोग करना चाहिए ।


25
+1, और स्पष्ट निष्कर्ष, एक व्यावहारिक और शब्दार्थ के दृष्टिकोण से: का constउपयोग केवल स्थिरांक - स्थिरांक मान के लिए किया जाना चाहिए , जो कभी भी , कभी भी बदल जाए।
ल्यूक जुएल

3
@LukeH कभी, कभी, कभी थोड़ा मजबूत है। मैं किसी भी बुरी चीज के बारे में नहीं सोच सकता, अगर कोई एक निजी स्ट्रिंग को कास्ट घोषित करने और दो पुनर्मिलन की घटनाओं के बीच इसे बदलने के लिए होता।
ब्रेंडा बेल

5
@Brenda: मैं मानता हूँ कि मैं उन private constमूल्यों के लिए उपयोग करता हूँ जो कड़ाई से नहीं बोल रहे हैं, निरंतर हैं; मूल रूप से यह constसूक्ष्म अनुकूलन उद्देश्यों के लिए दुरुपयोग है। मैं अपने "कभी, कभी, कभी" बयान से खड़ा होने जा रहा हूं , भले ही यह मुझे एक पाखंडी बना दे। ;)
ल्यूक

विशेष रूप से तार के मामले में प्रदर्शन के बारे में क्या? क्या प्रत्येक कास्ट उपयोग स्मृति में एक स्ट्रिंग की एक नई प्रति उत्पन्न करेगा?
एंड्री

@Andrii नहीं, लगातार तार एक बार बनाए जाते हैं। प्रत्येक उपयोग में स्मृति में एक ही संदर्भ होगा।
मिग

43

यहाँ पेशेवरों और विपक्ष का एक अच्छा टूटना है :

तो, ऐसा प्रतीत होता है कि स्थिरांक का उपयोग तब किया जाना चाहिए जब यह बहुत कम संभावना है कि मूल्य कभी भी बदल जाएगा, या यदि कोई बाहरी एप्लिकेशन / लिबास निरंतर का उपयोग नहीं करेगा। रन-टाइम गणना की आवश्यकता होने पर, या यदि बाहरी उपभोक्ता एक कारक हैं, तो स्थैतिक आसानी से खेतों का उपयोग किया जाना चाहिए।


19
लेख से बहुत दिलचस्प बिंदु - "एक उच्च स्तर पर, स्थिरांक को स्पष्ट रूप से संकलन-समय पर निपटाया जाता है, जबकि स्थैतिक आसानी से फ़ील्ड को उस समय निर्धारित किया जाता है जब उनका मूल्यांकन रन-टाइम पर किया जाता है। तथ्य यह है कि निरंतर मानों को संकलक द्वारा सदस्यता दी जाती है। इसका मतलब है कि कोई भी लाइब्रेरी / असेंबली जो निरंतर मूल्य को संदर्भित करती है, अगर निरंतर मूल्य में परिवर्तन होता है, तो उसे पुन: संकलित करने की आवश्यकता होगी। स्थिर स्थैतिक क्षेत्र का संदर्भ देने वाले पुस्तकालय क्षेत्र का संदर्भ देंगे और मूल्य का नहीं, इस प्रकार वे आवश्यकता के बिना क्षेत्र में कोई भी परिवर्तन करेंगे।
पुनर्मूल्यांकन के

1
हाँ, मैंने पढ़ा है कि और एक हुह पल था। मुझे निश्चित रूप से पता नहीं था।
स्पिन जूल

यहां Google कैश्ड संस्करण है: webcache.googleusercontent.com/…
spinon

2
संदर्भ लिंक अब उपलब्ध नहीं है।
सॉलोमन झांग

समाधान के रूप में चिह्नित उत्तर के लिए यह एक उत्कृष्ट प्रशंसा है। उपयोग को परिभाषित करना बहुत सहायक है। मुझ से +1।
Bonez024

11

const

public const string MyStr;

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

static readonly

public static readonly string MyStr;

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


6

OQ ने static stringvs के बारे में पूछाconst । दोनों के अलग-अलग उपयोग के मामले हैं (हालांकि दोनों को स्थिर माना जाता है)।

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

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

यदि आपका मतलब static readonlyबनाम है const, तो मैं static readonlyलगभग सभी मामलों के लिए सिफारिश करूंगा क्योंकि यह भविष्य का प्रमाण है।


यह "ओक्यू" आप किसकी बात करते हैं?
पीटर मोर्टेंसन

"मूल प्रश्न"
बेन एस्टन

0

आप static readonly stringकेवल staticक्लास के कंस्ट्रक्टर या वैरिएबल इनिशियलाइज़र के मूल्य को बदल सकते हैं, जबकि आप किसी constस्ट्रिंग के मूल्य को कहीं भी नहीं बदल सकते ।


2
मैं यह नहीं देखता कि यह पहले से मौजूद जवाबों से क्या कहता है।
निधि मोनिका का मुकदमा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.