Parse v। TryParse


111

Parse () और TryParse () के बीच अंतर क्या है?

int number = int.Parse(textBoxNumber.Text);

// The Try-Parse Method
int.TryParse(textBoxNumber.Text, out number);

क्या ट्राइ-कैच ब्लॉक की तरह त्रुटि-जाँच का कोई रूप है?

जवाबों:


155

Parseएक अपवाद फेंकता है तो यह, मूल्य पार्स नहीं कर सकता जबकि TryParseरिटर्न एक boolसंकेत है कि क्या यह सफल रहा।

TryParseसिर्फ try/ catchआंतरिक रूप से नहीं है - इसका पूरा मतलब यह है कि इसे अपवाद के बिना लागू किया जाता है ताकि यह तेज हो। वास्तव में यह जिस तरह से लागू होने की संभावना है, वह यह है कि आंतरिक रूप से Parseविधि कॉल करेगी TryParseऔर यदि वह वापस आती है तो एक अपवाद को फेंक देगीfalse

संक्षेप में, उपयोग करें Parseयदि आप सुनिश्चित हैं कि मूल्य मान्य होगा; अन्यथा उपयोग करें TryParse


1
"आंतरिक रूप से पार्स विधि TryParse को बुलाएगी" उस Parse को छोड़कर, कई संस्करणों द्वारा TryParse को पूर्व दिनांकित किया गया। बेशक, वे मूल कार्यान्वयन को TryParse में स्थानांतरित कर सकते थे ...
जोएल

4
@Joel - मैं वे कार्यान्वयन स्थानांतरित कर दिया जाएगा मान लिया है, लेकिन मैं सिर्फ परावर्तक के साथ एक नज़र था और वे के साथ अलग कार्यान्वयन हैं वास्तव में एक ही अन्य कोड एक से अधिक 'फेंक ...' और एक 'वापसी झूठी' है। मुझे आश्चर्य है कि क्यों वे समेकित नहीं हैं ?!
ग्रेग बीच

6
हालाँकि, इसके बारे में सोचते हुए, पार्से ने कई अलग-अलग अपवादों को फेंका, इसलिए यदि यह सभी TryParse से एक बूल था, तो यह नहीं पता होगा कि किसको फेंकना है।
ग्रेग बीच

5
"यदि आप सुनिश्चित हैं कि मान मान्य होगा तो पार्स का उपयोग करें"। मैं जोड़ूंगा, "लेकिन आप इस संभावना को स्वीकार करते हैं कि आप गलत हो सकते हैं"। यदि आप 100% सुनिश्चित थे कि यह पार्स कर सकता है, तो आप ठीक से TryParse का उपयोग कर सकते हैं जो तेज हो सकता है।
जॉन

2
और "अलग-अलग अपवादों" से, @GregBeech का अर्थ है संदेश, वर्ग नहीं।
पॉल ड्रेपर

26

यदि स्ट्रिंग को पूर्णांक में परिवर्तित नहीं किया जा सकता है, तो

  • int.Parse() एक अपवाद फेंक देंगे
  • int.TryParse() गलत वापस आएगा (लेकिन अपवाद नहीं फेंकें)

क्या होगा अगर मैं int.TryParse (some_method_that_throws_exception (), इंट टेस्ट आउट) का उपयोग करता हूं? क्या यह किसी अपवाद को या केवल पार्सिंग से संबंधित लोगों को ही पकड़ पाएगा?
अलेक्जेंड्रू एंटोची

@AlexandruAntochi आपको टिप्पणी के रूप में एक प्रश्न नहीं पूछना चाहिए। इससे दूसरों के लिए उपयोगी उत्तरों से लाभ उठाना लगभग असंभव हो जाएगा। हालांकि, इसे अपने समय के लायक बनाने के लिए, आपके प्रश्न का उत्तर नहीं है, int.TryParse बिल्कुल नहीं फेंकेगा। यदि विधि पार्स करने में विफल हो जाती है, तो यह केवल झूठे के वापसी मूल्य से इसे प्रतिबिंबित करेगा। यह अगर (int.TryParse… का उपयोग करने के लिए सुविधाजनक बनाता है तो केवल कुछ करने के लिए अगर पार्स सफल होता है।
रोब

3

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

एक फुटनोट के रूप में, सबसे TryParse तरीकों से अशक्त होने के लिए एक अपवाद फेंक दिया जाएगा।


अशक्त मूल प्रकारों में प्रवेश करना (int, double, DateTime, इत्यादि) एक अपवाद नहीं
फेंकेंगे

3

TryParse और Exception Tax

यदि एक स्ट्रिंग से निर्दिष्ट डेटाटाइप में रूपांतरण विफल हो जाता है, तो पार्स एक अपवाद फेंकता है, जबकि TryParse स्पष्ट रूप से अपवाद को फेंकने से बचता है।


यदि आप सबसे अभिन्न TryParse तरीकों के लिए अशक्त हो जाते हैं, तो TryParse अपवाद छोड़ देगा।
रे बोयसेन

1
बढ़िया लिंक। मुझे आश्चर्य है कि किसी ने अभी तक "जो सबसे अच्छा है या जो कोडिंग अभ्यास लागू किया जाना चाहिए" चर्चा शुरू नहीं की है।
क्रिश्चियन मैडसेन

0

TryParse मान नहीं लौटाता है, यह इंगित करने के लिए कि क्या पार्स सफल हुआ (और अपवाद नहीं फेंकता) एक स्थिति कोड देता है।


6
TryParse पैरामीटर दो के माध्यम से मान लौटाता है जो आउट कीवर्ड के साथ निर्दिष्ट होता है।
क्रिश्चियन मैडसेन

0

रिकॉर्ड के लिए, मैं दो कोड का परीक्षण कर रहा हूं: यह केवल एक स्ट्रिंग से एक संख्या में बदलने की कोशिश करता है और यदि यह विफल हो जाता है तो संख्या को शून्य पर असाइन करें।

        if (!Int32.TryParse(txt,out tmpint)) {
            tmpint = 0;
        }

तथा:

        try {
            tmpint = Convert.ToInt32(txt);
        } catch (Exception) {
            tmpint = 0;
        }

C # के लिए, सबसे अच्छा विकल्प tryparse का उपयोग करना है क्योंकि try & Catch वैकल्पिक ने अपवाद को फेंक दिया

A first chance exception of type 'System.FormatException' occurred in mscorlib.dll

यह दर्दनाक धीमा और अवांछनीय है, हालांकि, कोड तब तक बंद नहीं होता है जब तक कि डिबग का अपवाद इसके साथ रुकने के लिए तय नहीं हो जाता है।


पहला कोड स्निपिट कुछ भी नहीं करता है, क्योंकि अगर पहले से ही एक स्ट्रिंग के रूप में पार्स करने में सक्षम नहीं है, तो टैम्पिन पहले से ही शून्य पर सेट हो जाएगा।
एंड्रयू नीली

0

मैं इसकी एक बहुत पुरानी पोस्ट जानता हूं, लेकिन Parse vs TryParse पर कुछ और विवरण साझा करने के बारे में सोचा।

मेरे पास एक ऐसा परिदृश्य था जहाँ DateTime को स्ट्रिंग में परिवर्तित करने की आवश्यकता है और यदि datevalue null या string.empty है तो हम एक अपवाद का सामना कर रहे थे। इसे दूर करने के लिए, हमने Parse को TryParse से बदल दिया है और इसे डिफ़ॉल्ट तारीख मिलेगी।

पुराना कोड:

dTest[i].StartDate = DateTime.Parse(StartDate).ToString("MM/dd/yyyy");
dTest[i].EndDate = DateTime.Parse(EndDate).ToString("MM/dd/yyyy");

नया कोड:

DateTime startDate = default(DateTime);
DateTime endDate=default(DateTime);
DateTime.TryParse(dPolicyPaidHistories[i].StartDate, out startDate);
DateTime.TryParse(dPolicyPaidHistories[i].EndDate, out endDate);

एक और वेरिएबल घोषित करना है और आउट फॉर ट्रायपार्स के रूप में उपयोग किया जाता है।


आपको आरंभ करने की आवश्यकता नहीं है startDateऔर endDateजैसा DateTime.TryParseकि हमेशा उनके साथ लिखना होगा DateTime.MinValue। यदि गलत दिनांक अभ्यावेदन को भिन्न मान में परिवर्तित किया जाना चाहिए, तो वापसी मूल्य की जाँच करें DateTime.TryParseऔर यदि यह गलत है, तो मूल्य को स्पष्ट रूप से निर्धारित करें।
पालेक

का उपयोग करना DateTime?( दिनांक समय से
अशक्त

-1

double.Parse ( "-"); एक अपवाद उठाती है, जबकि double.TryParse ("-", आउट पार्स); पार्स करने के लिए 0 तो मुझे लगता है कि TryParse अधिक जटिल रूपांतरण करता है।


4
लेकिन करता है TryParse वापसीtrue या false? यह कैसे पता चलेगा कि यह "वैध" है।
पॉल ड्रेपर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.