2010-08-11 10 views
7

सी # में रूपांतरणों के प्रकार के लिए सर्वोत्तम प्रथाएं क्या हैं?सी # में सुरक्षित प्रकार के रूपांतरण के लिए सर्वोत्तम प्रथाएं क्या हैं?

int temp=System.ConvertToInt32(Request.QueryString["Id"]); 
    if (temp!=null) 
     { // logic goes here } 

यह विफल रहता है ईद किसी भी तरह पता चला है 'एबीसी' होने का

से अलग त्रिगुट ऑपरेटरों और अन्य एकल लाइन बयानों के के उपयोग सलाह कृपया कोई अन्य बयान करता है, तो (एकल लाइन त्रिगुट ऑपरेटर्स का उपयोग कर की तरह)। साथ ही, क्या आप कनवर्ट & पर TryParse पसंद करते हैं तो ऐसा क्यों? अपने कहो साथी है।

+1

अस्थायी मेरे लिए एक TryParse विधि है प्रतीत नहीं होता ऊपर –

उत्तर

7

TryParse स्पष्ट लाभ यह है कि विफलता के मामले में यह बजाय अवास्तविक लौटाते हैं एक अपवाद फेंकने की है दिखाने के लिए बदल दिया है। कुछ

मानक पैटर्न होगा जैसे:

int value; 
if (int.TryParse(Request.QueryString["Id"], out value)) 
{ 
    // Use value 
} 
else 
{ 
    // Do whatever you want on failure 
} 

अब, यह भी ध्यान रखें कि आप int.TryParse एक IFormatProvider और दे सकते हैं में असर के लायक है एक NumberStyles - उदाहरण के लिए, आप अच्छी तरह से CultureInfo.InvariantCulture के रूप में निर्दिष्ट करने के लिए चाहते हो सकता है IFormatProvider यदि यह वास्तव में एक ऑटो-जेनरेट आईडी (उपयोगकर्ता द्वारा दर्ज किए गए एक के बजाय) होने का मतलब है।

public static int? NullableTryParseInt32(string text) 
{ 
    int value; 
    return int.TryParse(text, out value) ? value : (int?) null; 
} 

फिर आप इस ताकि तरह उपयोग कर सकते हैं:

आप प्रभावी रूप से "डिफ़ॉल्ट मान" करना चाहते हैं तो आप इस तरह एक सहायक विधि लिख सकता है

int value = NullableTryParseInt32(text) ?? 10; 

या फिर आप लिख सकते हैं एक विधि जो निश्चित रूप से एक डिफ़ॉल्ट मान लेती है :)

+0

हाय जॉन, उत्तर के लिए धन्यवाद में एक स्ट्रिंग पार्स चाहते हैं। टर्नरी ऑपरेटर के साथ आप यह कथन कैसे करेंगे? यह भी नहीं है कि हर बार जब मैं मूल्यांकन करता हूं, मैच करता हूं या कोई मिलान नहीं करता हूं तो 'आउट' शुरू होता है? क्या हम इसके कारण ट्राईपर्स से बच नहीं सकते? –

+0

@Popo: हाँ, 'out' पैरामीटर किसी भी तरह से आरंभ नहीं हो जाता, लेकिन क्यों आप उसकी वजह से बच जाएंगे' TryParse'? मैंने इस मामले में इसे सरल बनाने के लिए कुछ और विकल्प जोड़े हैं, जहां एक डिफ़ॉल्ट मान समझ में आता है - लेकिन अक्सर पहला रूप वास्तव में जाने वाला होता है। –

+0

धन्यवाद जॉन, क्या कोशिश करें केवल सत्य/झूठी वापसी करें? क्या मैं TryParse में अपवादों की जांच कर सकता हूं क्योंकि सनरास ने कनवर्ट का उपयोग करने में किया था? –

0

इंट क्लास की TryParse विधि का उपयोग करें।

int temp; 
if (int.TryParse(Request.QueryString["Id"], out temp) 
    { // logic goes here } 

यदि आईडी में कोई संख्या नहीं है तो TryParse झूठी वापसी करेगा।

अद्यतन: int.TryParse

+0

स्ट्रिंग में अशक्त कभी नहीं होगा ... आप आप int.TryParse टाइप करने के लिए अर्थ नहीं थे यकीन है? – Chris

+0

यहां चिंता का विषय नहीं है? –

+0

मुझे लगता है कि आप सब के बाद int.TryParse उपयोग करने के लिए वहाँ कोई string.TryParse है, इसका मतलब तुम क्यों एक स्ट्रिंग ;-) –

1

जब किसी भी समस्या को हल करने की बात आती है जिसमें कई समान समाधान होते हैं तो मैं पाठक को व्यक्त करने वाले व्यक्ति को खोजने का भी प्रयास करता हूं कोड जो मैं cleieret पूरा करने की कोशिश कर रहा हूँ। मेरे विरोध में इसका मतलब है कि इस विशेष मामले में। ट्राईपर्स।

TryParse का उपयोग करते हुए पाठक है कि आप की गारंटी नहीं है कि इनपुट मान्य है बताता है (तुम थे अगर मैं बजाय पार्स का उपयोग करेंगे) और चूंकि आप वास्तव में कर रहे किसी पूर्णांक आप हो सकता है के रूप में इनपुट पार्स करने के लिए और साथ ही कोशिश कर कोड को पढ़ने के लिए लाइन जाने अपने इरादों

1

आप दो तरीके है कि

int i; 
if (Int32.TryParse(Request.QueryString["Id"], out i)) 
{ 
} 

या आप कर सकते हैं:

try 
{ 
    Convert.ToInt32(Request.QueryString["Id"]); 
} 
catch (FormatException ex) 
{ 
    // The field Id it's not convertible 
} 
catch (Exception ex) 
{ 
    // It could throw also ArgumentException or OverflowException 
} 
+0

हाय sinrisas, मैं tryParse में अपवाद कैसे पकड़ सकता है? –

+0

ठीक है, आप इसे पकड़ने के कथन में डाल सकते हैं। एकमात्र अपवाद TryParse फेंक सकता है, जहां तक ​​मुझे पता है, यह ArgumentException है लेकिन इस मामले में मुझे लगता है कि आप हमेशा इसे एक स्ट्रिंग पास करेंगे, इसलिए आपको ऐसा अपवाद कभी नहीं मिलेगा। विचार TryParse इसके पीछे, एक कोशिश पकड़ कथन का उपयोग करने के लिए नहीं है के रूप में यह सही या गलत रिटर्न रूपांतरण सलाह जॉन के लिए –

1

उत्तर देता का उपयोग करना TryParse सबसे अच्छा विकल्प होगा। कन्वर्ट विधि से अपवाद पकड़ना महंगी ऑपरेशन है।बेशक TryParse तार पार्स करने से (unboxing, से लंबे/डबल नीचे कास्टिंग) के अलावा केवल स्वीकार करता है, जबकि Convert.ToInt32 वस्तु ले जाएगा और रूपांतरण प्रदर्शन कर सकते हैं।

1

इस सवाल का त्रिगुट ऑपरेटर पहलू को कवर करने के लिए:

त्रिगुट ऑपरेटरों के उपयोग पर मेरी सलाह उन्हें है कि यह आप के लिए स्वाभाविक रूप से पढ़ता है अगर आप पहले से ही विचाराधीन कोड के साथ इतना परिचित नहीं हैं उपयोग करने के लिए नहीं है । चिंता परिचित और अजीब, अजनबी परिचित बनाता है।

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

जब मैं कुछ के साथ अपरिचित हूँ, मैं नीचे 'बेबी बात "कोड के लिए पहली बार में ड्रॉप, नई बात जानने के लिए, और उसके बाद मेरे सामान्य अधिक संक्षिप्त शैली में के बाद एकीकृत।

+0

धन्यवाद की सफलता पर निर्भर करता है। –

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

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