2013-02-12 29 views
20

अभिव्यक्ति Convert.ToInt32(String.Empty) एक प्रारूप अपवाद उठाएगा क्योंकि यह एक इंट 32 मान में खाली स्ट्रिंग को पार्स नहीं कर सकता है।कन्वर्ट। TInt32 (स्ट्रिंग) String.Empty बनाम नल

हालांकि, सी # में VB.NET या Convert.ToInt32((string)null) में Convert.ToInt32(DirectCast(Nothing, String)) अभिव्यक्ति शून्य के इंट 32 मान पर शून्य को पार्स करेगी।

Convert.cs में नेट स्रोत में खुदाई, मैं निम्नलिखित कोड देखें:

public static int ToInt32(String value) { 
    if (value == null) 
     return 0; 
    return Int32.Parse(value, CultureInfo.CurrentCulture); 
} 

यह व्यवहार बताते हैं, लेकिन मैं समझता हूँ कि क्यों यह इस तरह से लिखा गया था चाहते हैं, बजाय एक शून्य लौटने का एक खाली स्ट्रिंग के लिए भी?

उदाहरण के लिए, यह क्यों नहीं लिखा गया था के रूप में:

public static int ToInt32(String value) { 
    if (String.IsNullOrEmpty(value)) 
     return 0; 
    return Int32.Parse(value, CultureInfo.CurrentCulture); 
} 

(ध्यान दें कि String.IsNullOrEmpty() और Convert.ToInt32() दोनों वापस .NET 2.0, संभवतः पहले की तारीख।)

संपादित करें: मेरा प्रश्न this question के समान है, लेकिन मुझे यह भी जानना है कि Convert.ToInt32(String.Empty)0 के Int32 डिफ़ॉल्ट मान को वापस करने के बजाय अपवाद उठाता है। (उत्तर जा रहा है कि String.EmptyString का डिफ़ॉल्ट मान नहीं है, इसलिए वहाँ कोई संबंध है।)

+6

नल को डेटा की अनुपस्थिति के रूप में देखा जा सकता है - जबकि एक खाली स्ट्रिंग * एक स्ट्रिंग है, केवल एक खाली है ... और यह कोई संख्या नहीं है। (व्यक्तिगत रूप से मैं इसे शून्य के साथ इतना लचीला नहीं होना चाहूंगा, लेकिन यह एक अलग मामला है।) –

+0

दिलचस्प प्रश्न के लिए +1। मैं उम्मीद करता था कि यह एक अपवाद फेंकने की तरह होगा, बस "" गुजरने की तरह। * विशेष रूप से * जब Int32.Parse (शून्य) एक अपवाद फेंकता है! (ठीक है, ठीक है, यह कनवर्टिंग और पार्सिंग के बीच सूक्ष्म अंतर है - लेकिन यहां तक ​​कि ...) –

+0

यदि आप वास्तव में इस प्रकार के प्रश्न के साथ अपने दिमाग को उड़ाना चाहते हैं तो SQL 'NULL' बनाम C#' null' की तुलना करें और अनुबंध करें। –

उत्तर

6

मैं बिल्कुल इसके पीछे वास्तविक डिजाइन टीम के तर्क में कोई जानकारी है, लेकिन यह मेरे लिए है कि यह किसी प्रकार का हो सकता है लगता है "डिफ़ॉल्ट मान समकक्ष"। नल स्ट्रिंग का डिफ़ॉल्ट मान है, इसलिए यह int के डिफ़ॉल्ट मान में रूपांतरित करने के लिए तार्किक लगता है। String.Empty हालांकि किसी अन्य गैर-शून्य स्ट्रिंग डेटा की तरह एक स्ट्रिंग है, इसलिए इसे प्रारूपित होने की उम्मीद है, इसलिए अपवाद।

मुझे लगता है कि ArgumentNullException "स्वच्छ" निर्णय हो गया होता, लेकिन मैं नहीं जानता कि जो कुछ आंतरिक मुद्दों यह सब के पीछे हो सकता है ...

एक और संपादित करें:
वहाँ, MSDN documentation में सही , 5 संभावित परिणामों में से एक:

एक सफल रूपांतरण। पिछले परिणामों में सूचीबद्ध दो अलग-अलग आधार प्रकारों के बीच रूपांतरणों के लिए, सभी चौड़े रूपांतरणों के साथ-साथ सभी संकीर्ण रूपांतरण जो परिणामस्वरूप डेटा की हानि नहीं करते हैं, सफल होंगे और विधि लक्षित आधार प्रकार का मान वापस कर देगी।

ऐसा लगता है किसी दूसरे प्रकार में अशक्त वस्तु से रूपांतरण (एक प्रारूप त्रुटि, नहीं एक असमर्थित प्रकार रूपांतरण नहीं) विफल कोई कारण नहीं है, लेकिन इस तरह पूर्णांक के रूप में एक मान प्रकार "कोई डेटा का कोई प्रतिनिधित्व नहीं है ", इसलिए लक्ष्य प्रकार का एक डिफ़ॉल्ट मान उत्पन्न होता है।

एक त्वरित सोचा - "विपरीत" रूपांतरण, Convert.ToString(0), उपज नहीं है क्योंकि अशक्त:

  • 0 डेटा है, यह बहुत वैध और कई मामलों में महत्वपूर्ण मान हो सकता है
  • अशक्त एक नहीं है 0
+0

मैं इसे स्वीकार करूंगा क्योंकि यह मेरी जिज्ञासा खुजली को खरोंच करता है। Http://stackoverflow.com/questions/11580208/why-convert-toint32null-returns-0-in-c-sharp/11580256#11580256 में "वीबी 6 विरासत समर्थन" का जवाब है कि @ Cyborgx37 ने मूल प्रश्न पर टिप्पणी में पोस्ट किया मेरे लिए एक वैध कारण भी प्रतीत होता है। – MCattle

+3

बहुत दिलचस्प है। आज के एक्सकेसीडी स्ट्रिप के लिए भी प्रासंगिक :) http://xkcd.com/1172/ –

+0

मुझे नहीं लगता कि एमएसडीएन लिंक के मुताबिक तर्कसंगत धारण किया जाना चाहिए क्योंकि एक स्ट्रिंग को किसी भी संख्यात्मक प्रकार में परिवर्तित करने के बाद से फेंक दिया जाना चाहिए। वैध संख्या के रूप में पहचाना नहीं गया "। – Jonathan