2016-03-11 7 views
5

मुझे पता है कि यह एक बहुत बेवकूफ सवाल की तरह लग सकता है लेकिन मैं इस पर जवाब से बाहर हूं। हमारे उपयोगकर्ताओं में से एक ने हाल ही में एक बग की सूचना दी और मुझे एहसास हुआ कि कोड का पुराना बिट != string.Empty का उपयोग कर रहा था, बल्कि IsNullOrEmpty()। मैंने इसे IsNullOrEmpty() के साथ तय किया है और अब यह ठीक चल रहा है, लेकिन मैं वास्तव में समस्या को समझना चाहता हूंस्ट्रिंग्स की तुलना में! = ऑपरेटर अलग-अलग परिणाम दे रहा है?

बात यह है कि कुछ मशीनों पर कोड का सटीक थोड़ा अलग चलता है। मैं मूल रूप से एक वस्तु है: context["MODE"], जो खाली होना चाहिए।

 contextBuilder.AppendLine("MODE: |" + context["MODE"] + "|"); 
     contextBuilder.AppendLine("MODE != string.Empty: " + (context["MODE"] != string.Empty)); 
     contextBuilder.AppendLine("MODE TRIM != string.Empty: " + (context["MODE"].ToString().Trim() != string.Empty)); 
     contextBuilder.AppendLine("MODE.IsNullOrEmpty: " + string.IsNullOrEmpty(context["MODE"].ToString())); 
     contextBuilder.AppendLine("MODE.TRIM.IsNullOrEmpty: " + string.IsNullOrEmpty(context["MODE"].ToString().Trim())); 

यहाँ है कि क्षेत्र विवरण के बारे में अपने लॉग हैं::

MODE: || 
MODE != string.Empty: False 
MODE TRIM != string.Empty: False 
MODE.IsNullOrEmpty: True 
MODE.TRIM.IsNullOrEmpty: True 

यहाँ उसकी लॉग हैं:

MODE: || 
MODE != string.Empty: True 
MODE TRIM != string.Empty: False 
MODE.IsNullOrEmpty: True 
MODE.TRIM.IsNullOrEmpty: True 

है के रूप में आप देख सकते हैं मैं लॉग इन करने के लिए उस पर कुछ परीक्षण जोड़ा एक अंतर: MODE != string.Empty मेरे लिए झूठा है (समझ में आता है), उसके लिए सच है! मोड स्पष्ट रूप से शून्य नहीं है (अन्यथा .ToString() विफल हो गया होगा) समस्या IsNullOrEmpty का उपयोग कर तय की गई है, लेकिन मैं यह पता लगाने की कोशिश कर रहा हूं कि यह कुछ उपयोगकर्ता की मशीनों पर क्यों काम नहीं करेगा, न कि दूसरों को। आम तौर पर मेरे परीक्षणों में से कुछ में हमें कोई समस्या नहीं थी, अन्य थे।

मुझे वास्तव में समझ में नहीं आता कि मैं इसके बारे में क्या सीख सकता हूं। उसका मोड शून्य और String.Empty से अलग क्यों है, लेकिन IsNullOrEmpty सच है? यह भी ध्यान रखें कि ट्रिम वास्तव में string.Empty के साथ-साथ

धन्यवाद!

+1

'IsNullOrEmpty' वास्तव में 0. – juharr

+1

को' Length' की तुलना भी की कोशिश करो बाहर मुद्रण 'संदर्भ [" मोड "] द्वारा खाली हिस्सा है। GetType()। नाम' भी। – juharr

+0

क्या आप 'संदर्भ ["मोड"] में मान की उत्पत्ति के बारे में अधिक जानकारी प्रदान कर सकते हैं? साथ ही, क्या आपने सुनिश्चित किया है कि .NET के संस्करण दोनों मशीनों पर समान हैं? –

उत्तर

4

यदि आप ToString() का उपयोग करते हैं, तो यह संकेत है कि context["MODE"] का प्रकार object है। यदि आप != का उपयोग कर किसी ऑब्जेक्ट की स्ट्रिंग के साथ तुलना करते हैं, तो आप स्ट्रिंग संदर्भों की तुलना कर रहे हैं, वास्तविक स्ट्रिंग मान नहीं।

तो "उसका मोड" एक खाली स्ट्रिंग है जो string.Empty के समान संदर्भ नहीं है।

तारों पर संदर्भ तुलना का उपयोग न करें; हमेशा == या != का उपयोग करने से पहले दोनों पक्ष string टाइप करें।

ध्यान दें कि सी # संकलक इस बारे में चेतावनी दे देना चाहिए था: CS0252: Possible unintended reference comparison

+0

@clcto यह सही आउटपुट है, क्योंकि 'String.Empty' के बराबर नहीं, झूठा लौटा, जिसका अर्थ है कि यह' स्ट्रिंग। लक्षण ' – Setsu

+0

के बराबर _is_ जैसा कि मैंने कहा था कि यह एक पुराना कोड था, जो उस लड़के द्वारा लिखा गया था यहां कंपनी में शामिल होने से पहले ऐप की देखभाल (और हाँ, एक चेतावनी थी कि वह चूक गया!)। मैं यहां सोच रहा हूं कि उसके परिणाम इस तरह क्यों हैं? उनका इनपुट खाली है, लेकिन 'string.Empty' के समान संदर्भ नहीं है। हालांकि जब मैं इसे ट्रिम करता हूं तो इसका एक ही संदर्भ होता है! यह संभवतः कैसे होगा? – Damascus

+0

'ट्रिम()' का रिटर्न प्रकार 'string' है, इसलिए संकलक उस मामले में मान तुलना का उपयोग करता है। – Daniel

संबंधित मुद्दे