string.Empty vs null। जो आप उपयोग करते हैं?


84

हाल ही में काम पर एक सहकर्मी ने मुझे बताया कि string.Emptyस्ट्रिंग चर सेट करते समय उपयोग नहीं करना चाहिए लेकिन nullयह स्टैक को प्रदूषित करता है?

वह कहता है कि मत करो

string myString=string.Empty; लेकिन करें string mystring=null;

क्या यह वास्तव में मायने रखता है? मुझे पता है कि स्ट्रिंग एक वस्तु है इसलिए यह समझ में आता है।

मुझे पता है कि एक मूर्खतापूर्ण सवाल है लेकिन आपका क्या विचार है?


1
मुझे पूरी तरह से यकीन नहीं है कि आप या तो ऐसा क्यों करेंगे ... क्या आप एक उदाहरण के रूप में चर्चा कर रहे कोड को थोड़ा और दे सकते हैं?
स्टसमिथ जूथ

कोई कोड नहीं है। मैंने अपने सहकर्मी से कहा कि मैं कुछ डिबगिंग को देखूं और उन्होंने कहा कि एक सामान्य नियम के रूप में "न ही स्ट्रिंग का उपयोग करें। खाली" इसे शून्य करने के लिए सेट करें क्योंकि यह स्टैक पर जाता है। व्यक्तिगत रूप से मैंने हमेशा स्ट्रिंग का उपयोग किया है। जैसे-जैसे समय निकलता है, "" के बजाय उपयोग करने के लिए सही चीज़ माना जाता है।
user712923


मेरे कहने का अर्थ है ... string.Empty, ""और nullसभी स्थिर मूल्य हैं, लेकिन वे सभी 'सरल' हैं जो मैं यह नहीं देख सकता कि आप एक चर के लिए क्यों असाइन करेंगे। यदि आपको एक outचर पर कब्जा करने की आवश्यकता है , तो सिर्फ उपयोग क्यों नहीं string myString;?
स्टसमिथ जूथ

8
इन दिनों, इस तरह के विषयों पर तर्क जो पठनीयता और शब्दार्थ पर ध्यान केंद्रित नहीं करते हैं और बेतुका सूक्ष्म-अनुकूलन पर ध्यान केंद्रित करते हैं, सबसे अच्छे रूप में कमजोर होते हैं। जो भी आपके संदर्भ के लिए सही चीज का उपयोग करता है। (उदाहरण के लिए, यदि आप जानते हैं कि किसी का मध्य नाम नहीं है, तो आप उपयोग करते हैं String.Empty; यदि आप नहीं जानते कि किसी का आपके द्वारा उपयोग किया गया मध्य नाम है या नहीं null)। फिर, जब आपके पास सही अर्थ हो, तो कोड को इस तरह से लिखें जो स्पष्ट रूप से सही हो और आसानी से बनाए रखा जा सके।
जेसन

जवाबों:


110

nullऔर Emptyबहुत अलग हैं, और मैं उनके बीच मनमाने ढंग से स्विच करने का सुझाव नहीं देता। लेकिन न तो कोई अतिरिक्त "लागत" है, क्योंकि Emptyएक एकल निश्चित संदर्भ है (आप इसे किसी भी समय उपयोग कर सकते हैं)।

एक लाड्सफल्ड की वजह से ढेर पर कोई "प्रदूषण" नहीं है - यह चिंता .... पागल है। एक लोड हो रहा nullहै यकीनन थोड़ा सस्ता है, लेकिन अगर आप मूल्य की जांच के बारे में सावधान नहीं हैं तो अशक्त-संदर्भ अपवाद हो सकते हैं।

व्यक्तिगत रूप से, मैं न तो उपयोग करता हूं ... अगर मुझे खाली स्ट्रिंग चाहिए तो मैं उपयोग करता हूं ""- सरल और स्पष्ट। इंटर्निंग का अर्थ है, इसका प्रति उपयोग ओवरहेड भी नहीं है।


IL स्तर पर, "" और खाली के बीच का अंतर सिर्फ ldstr बनाम ldsfld है - लेकिन दोनों एक ही एकल इंटर्न स्ट्रिंग संदर्भ देते हैं। इसके अलावा, अधिक हाल के .NET संस्करणों में JIT के प्रत्यक्ष अवरोधन हैं, जो वास्तव में एक स्थिर फ़ील्ड लुकअप किए बिना रिक्त स्ट्रिंग संदर्भ की उपज देता है । मूल रूप से, पठनीयता को छोड़कर, किसी भी तरह से देखभाल करने का कोई कारण नहीं है। मैं सिर्फ "" का उपयोग करता हूं।


5
@ user712923 अगर वह कोई ठोस चिंताओं के साथ वापस आता है, मैं उन्हें यह जानकर प्रसन्नता होगी
मार्क Gravell

4
@Marc: ASAIK "" एक ऑब्जेक्ट बनाता है जहाँ string.Empty नहीं है .. यह और यह जांचें । यह स्ट्रिंग इंटर्न पूल के साथ कुछ करना है ....
जलाल ने

7
@ हेमल: स्ट्रिंग.ई.नुल्लऑर्मेटी ()
विंको व्रसालोविक

1
""छह बार के बजाय बॉयलरप्लेट कोड का उपयोग करने के लिए +1 । जो कोई भी इस बकवास की वकालत की ?! @Jalal कि ब्रैड अब्राम पोस्टिंग गंभीर रूप से पुरानी है और यदि कंपाइलर अभी भी ऐसा करने के लिए उन दो कोड को ऑप्टिमाइज़ नहीं करता है, तो Microsoft के लिए शर्म की बात है! लेकिन उनका काम ठीक करना हमारा काम नहीं है। और वास्तव में, हमें इसकी आवश्यकता नहीं है: दूसरे लिंक में, लेज़ (टिप्पणियों में) ने विधानसभा आउटपुट की तुलना या तो संस्करण के साथ तुलना की है: वे समान हैं।
कोनराड रूडोल्फ

1
@ कोनराड: एक उदाहरण यह है कि जब निरंतर तारों को समतल किया जा रहा है: स्ट्रिंग वर्ग आंतरिक पूल का उपयोग करता है इसलिए जब आप एक नया तार बनाते हैं, तो कक्षा की जाँच करता है कि क्या स्ट्रिंग पहले से ही पूल में है और यदि पूल में नहीं जोड़ा गया है .. इसकी वजह से जब ""यह पूरे पूल को खोजेगा कि यह पहले से ही है या नहीं, और इस तरह से string.Empty;इसका उपयोग करते समय उस पूर्वनिर्धारित मूल्य का उपयोग करेंगे और खोज अब मौजूद नहीं होगी। वर्ग ने इस तरीके को भी उजागर किया: इसे string.Intern/IsInternedचेक करें
जलाल ने

34

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

nullडेटा की अनुपस्थिति को इंगित करने के लिए उपयोग किया जाना चाहिए, string.Empty(या "") डेटा की उपस्थिति को इंगित करने के लिए, वास्तव में कुछ खाली पाठ। क्या कोई विशिष्ट मामला है जहां आप सुनिश्चित नहीं हैं कि सबसे उपयुक्त क्या है?

संपादित करें, जोड़े गए उदाहरण:

  • आप string.Emptyकिसी व्यक्ति के नाम के लिए डिफ़ॉल्ट पोस्टफ़िक्स के रूप में उपयोग कर सकते हैं (ज्यादातर लोगों के पास उदाहरण के लिए पीएचडी नहीं है)

  • आप nullएक कॉन्फ़िगरेशन विकल्प के लिए उपयोग कर सकते हैं जो कि कॉन्फ़िगरेशन फ़ाइल में निर्दिष्ट नहीं था। इस स्थिति में, string.Emptyयदि कॉन्फ़िगरेशन विकल्प मौजूद था , तो इसका उपयोग किया जाएगा, लेकिन वांछित कॉन्फ़िगर किया गया मान एक खाली स्ट्रिंग था।


मैंने ऐसा कभी नहीं सोचा था, मुझे स्वीकार करना होगा। आपने जो कहा है, उस पर ध्यान दें, क्या आप मुझे एक उदाहरण देने के लिए बुरा मानते हैं। मुझे पता है कि आपका स्पष्टीकरण स्वयं व्याख्यात्मक है, लेकिन फिर भी ... धन्यवाद
user712923

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

@ कीरेन जॉनस्टोन, यदि किसी के पास कोई उपसर्ग नाम नहीं है, तो null"नो पोस्टफिक्स" का संकेत देने के लिए उपयोग क्यों नहीं किया जाएगा ?
१D

8

वे अलग-अलग हैं जैसा कि पहले से ही उत्तर दिया गया है।

static void Main(string[] args)
{
    string s1 = null;
    string s2 = string.Empty;
    string s3 = "";
    Console.WriteLine(s1 == s2);
    Console.WriteLine(s1 == s3);
    Console.WriteLine(s2 == s3);
}

 results:
 false     - since null is different from string.empty
 false     - since null is different from ""
 true      - since "" is same as string.empty

खाली स्ट्रिंग बनाम अशक्त स्ट्रिंग के प्रबंधन के साथ समस्या एक समस्या बन रही है जब आपको या तो इसे एक फ्लैट फ़ाइल में बनाए रखने या संचार के माध्यम से इसे स्थानांतरित करने की आवश्यकता होती है, इसलिए मुझे लगता है कि यह इस पृष्ठ पर जाने वाले अन्य लोगों के लिए उपयोगी हो सकता है जो एक अच्छा समाधान दे सकते हैं। वह विशेष समस्या।

स्ट्रिंग को फ़ाइल या संचार में सहेजने के उद्देश्य से:
आप शायद स्ट्रिंग को बाइट में बदलना चाहते हैं।
एक अच्छी प्रैक्टिस जो मैं सुझाता हूं कि हेडर बाइट्स के 2 सेगमेंट को आपकी परिवर्तित स्ट्रिंग में जोड़ना है।

खंड 1 - मेटा जानकारी जो 1 बाइट में संग्रहीत होती है और अगले खंड की लंबाई का वर्णन करती है।

खंड 2 - सहेजे जाने के लिए स्ट्रिंग की लंबाई रखता है।

उदाहरण:
स्ट्रिंग "abcd" - को सरल बनाने के लिए मैं इसे ASCII एनकोडर का उपयोग करके परिवर्तित करूँगा और {65,66,67,68} प्राप्त करूँगा।
गणना खंड 2 में 4 उपज होगी - इसलिए 4 बाइट्स परिवर्तित स्ट्रिंग की लंबाई हैं।
गणना खंड 1 में 1 उपज होगी - जैसा कि परिवर्तित स्ट्रिंग जानकारी की लंबाई जानकारी रखने के लिए सिर्फ 1 बाइट का उपयोग किया गया था (जो 4 था, अर्थात यदि यह 260 था तो मुझे 2 मिलेगा)

बाइट्स की नई पट्टी अब {1,4,65,66,67,68} होगी जिसे एक फाइल में सेव किया जा सकता है।

विषय के संबंध में लाभ यह है कि अगर मेरे पास बचाने के लिए एक खाली स्ट्रिंग थी, तो मुझे 0 की लंबाई में बाइट्स के एक खाली सरणी को रूपांतरण से मिलेगा और खंडों की गणना के बाद मैं समाप्त हो जाएगा {1,0} जो हो सकता है सहेजा और बाद में लोड किया गया और एक खाली स्ट्रिंग में वापस व्याख्या की गई। दूसरी ओर अगर मेरी स्ट्रिंग में अशक्त मान था तो मैं अपने बाइट को सहेजने के लिए बाइट सरणी के रूप में {0} होने पर समाप्त कर दूंगा और फिर से लोड किए जाने पर इसे वापस शून्य पर व्याख्या किया जा सकता है।

अधिक लाभ हैं जैसे कि पता है कि क्या लोड किया जाना है या जमा हो जाता है यदि आप कई तार जगते हैं।

इस विषय पर वापस - यह अच्छी तरह से प्रदूषित हो जाएगा जैसा कि वर्णित समान प्रिंसिपल किसी भी सिस्टम द्वारा रिक्त से नल को अलग करने के लिए उपयोग किया जा रहा है .. इसलिए हाँ string.Empty शून्य से अधिक स्मृति लेता है, हालांकि मैं नहीं कर सकता इसे प्रदूषण कहें .. यह सिर्फ 1 और बाइट है।


1

यह मौत के लिए उत्तर दिया गया है, लेकिन अशक्त का अर्थ है कोई मूल्य नहीं, आरंभिक नहीं। string.Empty का अर्थ है "" (एक रिक्त स्ट्रिंग) जैसा कि MSDN पर बताया गया है।

खाली या अशक्त स्ट्रिंग के लिए जाँच करने का सबसे सुरक्षित तरीका string.IsNullOrEmpty का उपयोग कर रहा है।


-2

FWIW, मैंने पाया कि मिश्रण ""और String.Emptyकाम नहीं करता है:

var a = "";
alert("a " + (a == "") + ", " + (a==String.Empty));   //Yields "a true, false"

var b = String.Empty;
alert("b " + (b == "") + ", " + (b == String.Empty)); //Yields "b false, true"

विशेष रूप से, यदि आप $.trimखाली DOM इनपुट फ़ील्ड का मान प्राप्त करने के लिए उपयोग करते हैं, तो इसकी तुलना करें String.Empty, आपको मिलता है false। यकीन नहीं है कि क्यों है, लेकिन तुम वहाँ जाओ। मैं अब सिर्फ ""हर जगह स्थिरता के लिए उपयोग करता हूं ।


1
हाँ। यही कारण है कि हम सभी को चेक करने .Length==0या उपयोग करने की आदत में रहना चाहिए.Compare()
zanlok

14
यह सवाल c # not js के बारे में पूछता है
कोल जॉनसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.