स्ट्रिंग की बात क्या है। खाली संपत्ति


35

string foo = string.Emptyबीसीएल में संपत्ति क्यों शामिल थी? यह केवल खाली स्ट्रिंग ( string foo = "") का उपयोग करने से अधिक स्पष्ट और कोई स्पष्ट नहीं लगता है


6
नाइटपिक: यह भाषा का हिस्सा नहीं है। यह बीसीएल का हिस्सा है। VB.NET और F # इसका उपयोग कर सकते हैं, साथ ही हर दूसरे .NET भाषा का भी।
ऊद

19
क्योंकि अन्यथा, आप बुरी चीजें नहीं कर सकते हैं typeof(string).GetField("Empty").SetValue(null, " ");;)
मेसन व्हीलर

1
@MasonWheeler - प्रतिबिंब की खुशियाँ। वास्तविक बुराई के लिए, आपको आत्मनिरीक्षण की आवश्यकता है, एह?
ओडेड

1
@MasonWheeler, +1। हे भगवान, काले चश्मे, वे कुछ नहीं करते हैं!]
मचाडो

1
@MasonWheeler यह शुद्ध, आसुत बुराई है। मुझे यह पसंद है। यदि आप रुचि रखते हैं तो प्रश्न: क्या यह सुरक्षित नहीं है (और शालीनता से) इसे लिखा होगा public static string Empty { get { return string.Intern(""); } }?
जेसी सी। स्लीकर

जवाबों:


55

मैं केवल यहां मान सकता हूं:

string.Emptyखोजकर्ता के लिए परिभाषित किया गया है - जब एक स्ट्रिंग को इनिशियलाइज़ किया जाता है, तो यह उस संदर्भ से स्पष्ट नहीं हो सकता है जो ""वास्तव में एक प्रारंभिक के रूप में स्पष्ट रूप से अभिप्राय था (इसके बजाय nullया कहें " "या परीक्षण के दौरान एक स्थान धारक के रूप में)। का उपयोग करना string.Emptyउस तरह के कॉंडम का एक निश्चित उत्तर है।

यह C का थ्रोबैक भी हो सकता है - C में एक खाली स्ट्रिंग एक खाली स्ट्रिंग नहीं है। यह एक ऐसा वर्ण सरणी है जिसका पहला वर्ण शून्य है (इसलिए, रिक्त), जो C # के समान नहीं है। यहाँ मेरा कहना यह है कि विभिन्न भाषाओं में आप अलग-अलग तरीकों से एक खाली स्ट्रिंग का प्रतिनिधित्व करेंगे (और उनके अलग-अलग अर्थ हो सकते हैं) - string.Emptyऐसी अस्पष्टता को रोकना।

जैसा कि अन्य लोग कई वस्तुओं के बारे में कहते हैं - यह एक समस्या नहीं है क्योंकि कोई भी स्ट्रिंग शाब्दिक संकलन पर नजरबंद नहीं होगी। इसमें string.Empty- का मान शामिल है ""। किसी भी समय इनमें से किसी को भी कोड में दोहराया जाता है, ऑब्जेक्ट को आंतरिक पूल से पुनर्प्राप्त किया जाएगा। यह प्रति ऐप डोमेन सही है ।


5
+1 अब तक का एकमात्र सही उत्तर है।
पीएसआर

कुछ भाषाओं में भी नहीं हो सकता है है एक खाली स्ट्रिंग शाब्दिक। जाहिर है, मानक पास्कल नहीं था।
dan04

2
"सी में एक खाली स्ट्रिंग एक खाली स्ट्रिंग नहीं है" - लेकिन फिर भी, यदि आप लिखते हैं "", तो आप प्राप्त करते हैं {'\0'}, इसलिए खाली स्ट्रिंग शाब्दिक और इसे परिभाषित करने के कुछ अन्य राउंडअबाउट के बीच कोई अंतर नहीं होगा।
detly

14

मैं उन स्रोतों के बारे में 100% निश्चित नहीं हूँ जहाँ मैंने ये सीखा है, लेकिन इसका उपयोग करने के कुछ बिंदुओं में शामिल हैं:

  • .NET असेंबली में प्रत्येक स्ट्रिंग अद्वितीय है, इसलिए है

    string foo = "";
    string bar = "";

    आउटपुट असेंबली में 2 स्ट्रिंग्स में परिणाम स्ट्रिंग्स अपरिवर्तनीय हैं। दोनों संदर्भ होने से string.Emptyअसेंबली का आकार कम हो जाता है।

  • मुखरता। जब आप string.Emptyइरादे में आते हैं , तो यह स्पष्ट है कि यह एक खाली स्ट्रिंग माना जाता है। लेकिन अगर आप भर आए foo = ""थे तो प्रोग्रामर ने परीक्षण करते समय स्ट्रिंग की सामग्री को हटा दिया था और इसे वापस जोड़ना भूल गया था, या क्या इस तरह से माना जाता है?

1
स्मृति में दो समान तार रखने के लिए यह एक अजीब व्यवहार प्रतीत होगा। क्या वास्तव में ऐसा किया गया है?
ऋग

36
वास्तव में, इसके विपरीत किया जाता है - इसे स्ट्रिंग इंटर्निंग कहा जाता है (अधिक सटीक रूप से, शाब्दिक रूप से इंटर्निंग)। मुझे पता है कि यह जावा और पायथन में किया गया है, और मुझे यकीन है कि यह .NET भाषाओं में भी है। बेशक, यह केवल एक अनुवाद इकाई के दायरे में हो सकता है, इसलिए जब तक कि डायनेमिक लोडर इस तरह के डेटा को एकीकृत नहीं करता है, आप प्रति प्रोग्राम फ़ाइल एक खाली स्ट्रिंग के साथ समाप्त हो सकते हैं। अभी भी बहुत ज्यादा नहीं है।

9
@delnan बिल्कुल सही है। ""/ string.Emptyइंटर्न हैं और केवल एक ऑब्जेक्ट बनाया जाएगा।
ऊद

11
@Andy - सभी स्ट्रिंग शाब्दिक .NET में प्रशिक्षु कर रहे हैं। सभी तार नहीं । क्रमिक रूप से बनाए गए तार डिफ़ॉल्ट रूप से नजरबंद नहीं होते हैं। MSDN पर String.Intern देखें ।
ओडेड

3
@Oded et alia: वास्तव में आप में से कोई भी बिल्कुल सही नहीं हैं। सबसे पहले, शाब्दिकों को एक विधानसभा के भीतर नजरबंद किया जाता है, लेकिन जरूरी नहीं कि विधानसभाओं के पार । दूसरा, असेंबलियों में खाली स्ट्रिंग को इंटर्न किया गया है या नहीं, यह एक कार्यान्वयन विवरण है; सीएलआर के कुछ संस्करण करते हैं और कुछ नहीं करते हैं। अन्य उत्तरों में से एक में इस तथ्य के बारे में मेरे लेख का लिंक है; विवरण के लिए इसे देखें।
एरिक लिपर्ट

2

के लिए कोई वस्तु नहीं बनाई जाएगी string.Empty। उपयोग करने ""से एक ऑब्जेक्ट बनेगा जो कि सबसे अधिक संभावना स्ट्रिंग इंटर्न पूल से आएगा।

अतीत में, लोग परीक्षण चलाते हैं और String.Emptyथोड़ा तेजी से निकलते हैं, लेकिन इसका सूक्ष्म अनुकूलन है।

String.Empty यह है:

//The Empty constant holds the empty string value.   
//We need to call the String constructor so that the compiler doesn't mark 
//this as a literal.   
//Marking this as a literal would mean that it doesn't show up as a field 
//which we can access from native.  
public static readonly String Empty = ""; 

2
तो आपका कहना है ...?

1
बिंदु String.Empty मूल रूप से "" के लिए एक स्थिर है। एक गहरे अर्थ के लिए String.cs के लेखक का पता लगाएं। :)
जॉन रेन्नोर

0

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

यदि आप अपने एप्लिकेशन में कई बार एक ही स्ट्रिंग का उपयोग कर रहे हैं, तो आप स्ट्रिंग के साथ String.Intern () कॉल करके उसी तरह के तंत्र का उपयोग कर सकते हैं। लेकिन अगर आप प्रत्येक स्ट्रिंग का उपयोग केवल एक बार कर रहे हैं, तो आप केवल अधिक मेमोरी का उपयोग करेंगे।

तो String.Empty केवल एक विशेष केस ऑप्टिमाइज़ेशन है जो अधिकांश .Net अनुप्रयोगों के लिए करने योग्य है, इसीलिए इसे BCL में एकीकृत किया गया था।

इस विषय पर अधिक विस्तार से मैं एरिक लिपर्ट के ब्लॉग पोस्ट को पढ़ने की दृढ़ता से सलाह देता हूं ।

आपको उनके ब्लॉग पोस्ट द्वारा संदर्भित इस दस्तावेज़ पर भी एक नज़र डालनी चाहिए ।


4
लिंक केवल उत्तर अच्छे उत्तर नहीं बनाते हैं। अगर एरिक ने कभी अपने ब्लॉग का पुनर्गठन किया तो यह जवाब बेकार हो जाएगा। कृपया यहां पोस्ट को संक्षेप में प्रस्तुत करें ताकि हमारे पास हाथ करने के लिए सभी जानकारी हो।
ChrisF

7
@ क्रिस: मैं कभी भी ब्लॉग का पुनर्गठन नहीं कर सकता। यह एक परिवर्तन होगा, और आप जानते हैं कि मैं उन लोगों के बारे में कैसा महसूस करता हूं।
एरिक लिपर्ट

1
@ EricLippert - मुझे एहसास है कि आप ऐसा कभी नहीं करेंगे, हालांकि, लिंक केवल उत्तर अच्छे उत्तर नहीं हैं और हमें लोगों को यह महसूस करने के लिए प्रोत्साहित करने की आवश्यकता है।
ChrisF

3
@EricLippert यह केवल पंचांग लिंक के बारे में नहीं है। यहां पाठकों के लिए यह राजनीतिकता के बारे में भी है, जवाब में सीधे कम से कम पर्याप्त सामग्री होनी चाहिए ताकि पाठक एक राय बना सकें कि क्या लिंक का पालन करना है। और उत्तर को एसई की एक ऑफ़लाइन प्रति में भी समझ में आना चाहिए।
गाइल्स का SO- बुराई पर रोक '21
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.