इस धागे को पढ़ने के बाद, मैंने थोड़ा प्रयोग किया, जिसने दो अलग, और दिलचस्प, निष्कर्ष निकाले।
निम्नलिखित पर विचार करें।
strInstallString "1" string
उपर्युक्त दृश्य स्टूडियो डीबगर की स्थानीय विंडो से कॉपी किया गया है। निम्नलिखित तीनों उदाहरणों में समान मान का उपयोग किया जाता है।
अगर (strInstallString == "") === अगर (strInstallString == string.Empty)
के बाद इन दो मौलिक समान के लिए कोड विजुअल स्टूडियो 2013 डिबगर के disassembly विंडो में प्रदर्शित है मामलों।
if (strInstallString == "")
003126FB mov edx,dword ptr ds:[31B2184h]
00312701 mov ecx,dword ptr [ebp-50h]
00312704 call 59DEC0B0 ; On return, EAX = 0x00000000.
00312709 mov dword ptr [ebp-9Ch],eax
0031270F cmp dword ptr [ebp-9Ch],0
00312716 sete al
00312719 movzx eax,al
0031271C mov dword ptr [ebp-64h],eax
0031271F cmp dword ptr [ebp-64h],0
00312723 jne 00312750
if (strInstallString == string.Empty)
00452443 mov edx,dword ptr ds:[3282184h]
00452449 mov ecx,dword ptr [ebp-50h]
0045244C call 59DEC0B0 ; On return, EAX = 0x00000000.
00452451 mov dword ptr [ebp-9Ch],eax
00452457 cmp dword ptr [ebp-9Ch],0
0045245E sete al
00452461 movzx eax,al
00452464 mov dword ptr [ebp-64h],eax
00452467 cmp dword ptr [ebp-64h],0
0045246B jne 00452498
अगर (strInstallString == string.Empty) नहीं काफी अलग
if (strInstallString.Length == 0)
003E284B mov ecx,dword ptr [ebp-50h]
003E284E cmp dword ptr [ecx],ecx
003E2850 call 5ACBC87E ; On return, EAX = 0x00000001.
003E2855 mov dword ptr [ebp-9Ch],eax
003E285B cmp dword ptr [ebp-9Ch],0
003E2862 setne al
003E2865 movzx eax,al
003E2868 mov dword ptr [ebp-64h],eax
003E286B cmp dword ptr [ebp-64h],0
003E286F jne 003E289C
ऊपर मशीन कोड लिस्टिंग से है, .NET फ्रेमवर्क के NGEN मॉड्यूल, 4.5 संस्करण द्वारा उत्पन्न , मैं निम्नलिखित निष्कर्ष निकालता हूं।
- रिक्त स्ट्रिंग के खिलाफ समानता शाब्दिक और System.String वर्ग पर स्थिर string.Empty संपत्ति के लिए
परीक्षण, सभी व्यावहारिक उद्देश्यों के लिए, समान। दो कोड स्निपेट्स के बीच एकमात्र अंतर पहला कदम निर्देश का स्रोत है, और दोनों डीएस के सापेक्ष ऑफ़सेट हैं, जिसका अर्थ यह है कि दोनों बेक्ड-इन स्थिरांक का संदर्भ देते हैं।
- रिक्त स्ट्रिंग के खिलाफ समानता, के रूप में या तो एक शाब्दिक या string.Empty संपत्ति के लिए
परीक्षण, एक दो तर्क समारोह कॉल, जो शून्य वापस लौट कर असमानता इंगित करता है सेट करता है। मैं इस निष्कर्ष को अन्य परीक्षणों पर आधारित करता हूं जिसे मैंने कुछ महीने पहले किया था, जिसमें मैंने प्रबंधित/अप्रबंधित विभाजन और पीछे के अपने कुछ कोड का पालन किया था। सभी मामलों में, दो या दो से अधिक तर्कों की आवश्यकता वाले किसी भी कॉल को ईसीएक्स रजिस्टर में पहला तर्क दिया जाता है, और दूसरा ईडीएक्स पंजीकृत होता है। मुझे याद नहीं है कि बाद के तर्क कैसे पारित किए गए थे। फिर भी, कॉल सेटअप __stdcall की तुलना में __fastcall की तरह दिखता था। इसी प्रकार, अपेक्षित वापसी मूल्य हमेशा पंजीकृत ईएक्स में दिखाई देते हैं, जो लगभग सार्वभौमिक है।
स्ट्रिंग की लंबाई का परीक्षण करना एक-तर्क फ़ंक्शन कॉल सेट करता है, जो 1 (रजिस्टर ईएक्स में) देता है, जो परीक्षण की स्ट्रिंग की लंबाई होती है।
यह देखते हुए कि तुरंत दिखाई मशीन कोड लगभग समान है, एकमात्र कारण है कि मैं कल्पना कर सकते हैं कि स्टिंग लंबाई हाकी द्वारा रिपोर्ट से अधिक स्ट्रिंग समानता के बेहतर प्रदर्शन के लिए खाते हैं कि दो तर्क समारोह जो कि निष्पादन करता है वह एक-तर्क फ़ंक्शन से काफी बेहतर अनुकूलित होता है जो स्ट्रिंग उदाहरण की लंबाई को पढ़ता है।
निष्कर्ष
सिद्धांत की बात है, मैं, एक शाब्दिक रूप में रिक्त स्ट्रिंग के खिलाफ की तुलना न करें क्योंकि रिक्त स्ट्रिंग शाब्दिक स्रोत कोड में अस्पष्ट दिखाई दे सकता है के रूप में। इसके अंत में, मेरे .NET सहायक वर्गों ने लंबे समय तक खाली स्ट्रिंग को स्थिर के रूप में परिभाषित किया है। हालांकि मैं स्ट्रिंग का उपयोग करता हूं। प्रत्यक्ष, इनलाइन तुलना के लिए का उपयोग करता है, निरंतर अन्य स्थिरांक को परिभाषित करने के लिए अपना रखता है जिसका मूल्य खाली स्ट्रिंग है, क्योंकि निरंतर स्ट्रिंग को असाइन नहीं किया जा सकता है। इसके मूल्य के रूप में।
यह अभ्यास स्ट्रिंग के साथ तुलना करने की लागत के बारे में किसी भी चिंता के लिए हो सकता है, अगर कोई हो, तो या मेरे सहायक वर्गों द्वारा निरंतर परिभाषित किया गया है।
हालांकि, यह इसे बदलने के लिए एक परेशान सवाल भी उठाता है; स्ट्रिंग के विरुद्ध तुलना क्यों कर रहा है। स्ट्रिंग की लंबाई का परीक्षण करने से अधिक कुशल? या क्या शिनि द्वारा उपयोग किया जाने वाला परीक्षण अवैध है क्योंकि लूप लागू किया गया है? (मुझे लगता है कि विश्वास करने के लिए मुश्किल है, लेकिन, तो फिर, मैं पहले भी मूर्ख बनाया गया है, के रूप में मुझे यकीन है कि तुम हो रहा हूँ!)
मैं लंबे समय से मान लिया है कि System.String वस्तुओं की गिनती की गई तार, मूल रूप से लंबे समय तक स्थापित मूल स्ट्रिंग (बीस्ट्र) के समान है जिसे हम लंबे समय से COM से जानते हैं।
मुझे लगता है कि ओपी खाली स्ट्रिंग सत्यापन के बारे में पूछ रहा था, न कि शून्यता, इसलिए जब आप पहले से ही जानते हैं कि स्ट्रिंग शून्य नहीं है, तो IsNullOrEmpty का उपयोग करना एक और अनावश्यक जांच है। तो ओपी का सवाल यह है कि अधिक प्रदर्शन, myString.Length> 0 या myString! = "" लेता है। Http://stackoverflow.com/questions/10230/checking-for-string-contents-string-length-vs-empty-string/2306659#2306659 – Shimmy