C # विधि नामों में "Try" का उपयोग कब माना जाता है?


180

हम अपने सहकर्मियों के साथ चर्चा कर रहे थे कि इसका क्या मतलब है अगर विधि का नाम "कोशिश" से शुरू होता है।

निम्नलिखित राय थीं:

  • "प्रयास" का उपयोग करें जब विधि एक शून्य मान लौटा सकती है।
  • "प्रयास" का उपयोग करें जब विधि एक अपवाद नहीं फेंक देगी।

आधिकारिक परिभाषा क्या है? विधि नाम में "कोशिश" क्या कहता है? क्या इस बारे में कुछ आधिकारिक दिशानिर्देश हैं?


83
+1 जो लोग अपने कार्यों के नाम में बहुत सोच रखते हैं वे वास्तव में "अगले आदमी" की तलाश में हैं। सुनिश्चित नहीं हैं कि क्यों यह करीब वोट हो रही है (और है कि एक पुरुष जो डाली है से आ रही एक बहुत उन्हें आज रात का।)
जोनाथन रीनहार्ट

7
@JonathonReinhart, को करीबी वोट मिले क्योंकि "जैसा कि वर्तमान में खड़ा है, यह प्रश्न हमारे प्रश्नोत्तर प्रारूप के लिए एक अच्छा फिट नहीं है। हम तथ्यों, संदर्भों या विशिष्ट विशेषज्ञता द्वारा समर्थित उत्तर की उम्मीद करते हैं, लेकिन इस प्रश्न पर बहस, तर्क की आवश्यकता होगी। , मतदान, या विस्तारित चर्चा। "
प्रणव होसांगदी

16
वहाँ है माइक्रोसॉफ्ट द्वारा एक आधिकारिक बयान है कि प्रश्न (मेरा उत्तर देखें) उत्तर देता है। यह कैसे एक तथ्य नहीं है?
एरिक शियरबॉम

6
@PranavHosangadi जैसा कि एरिक ने उल्लेख किया है, यह तथ्यों द्वारा समर्थित है। इसके अलावा, यहां बहुत अनुभवी सी # डेवलपर्स हैं जो एक वैध उत्तर प्रदान करने के लिए विशिष्ट विशेषज्ञता रखते हैं। हेल, एरिक लिपर्ट मुख्य C # भाषा वास्तुकार हैं। मुझे लगता है कि आप उस विशिष्ट विशेषज्ञता को बुला सकते हैं ।
जोनाथन रेनहार्ट

4
@ErikSchierboom यह एमएस गाइडलाइन तथ्य है। एमएस गाइडलाइन सब्जेक्टिव और डिबेटेबल है।
सेरी

जवाबों:


148

इसे TryParse पैटर्न के रूप में जाना जाता है और इसे Microsoft द्वारा प्रलेखित किया गया है। आधिकारिक अपवाद और प्रदर्शन MSDN पेज का कहना है :

उन सदस्यों के लिए TryParse पैटर्न पर विचार करें, जो अपवादों से संबंधित प्रदर्शन समस्याओं से बचने के लिए सामान्य परिदृश्य में अपवाद फेंक सकते हैं।

इस प्रकार यदि आपके पास एक कोड है जिसके लिए एक नियमित उपयोग के मामले का मतलब होगा कि यह एक अपवाद फेंक सकता है (जैसे कि एक इंट को पार्स करना), तो TryParse पैटर्न समझ में आता है।


2
एक और उपयोगी लिंक जो इस पैटर्न को दस्तावेज करता है (TryParse के लिए खोज) blogs.msdn.com/b/kcwalina/archive/2005/03/16/396787.aspx
विवेक

2
मूल रूप से, यदि आपके पास एक TryParse विधि है, तो आपके पास Parse विधि होनी चाहिए जो कि TryParse झूठी वापस आएगी। इसके विपरीत, यदि आपके पास एक पार्स विधि है, तो आपको एक ट्रायपर्स विधि पर विचार करना चाहिए जो पार्स को फेंकने पर झूठी वापस आ जाएगी
3Doubloons

5
+1। बस इसे जोड़ने के लिए, अपवाद आम तौर पर "असाधारण" परिस्थितियों के लिए हैं। यदि आप कुछ ऐसा कर रहे हैं जो आसानी से विफल हो सकता है और वह विफलता विशेष रूप से उल्लेखनीय नहीं है, तो इस पैटर्न का उपयोग एक कोशिश / पकड़ से अधिक मुहावरेदार है
एडम रॉबिन्सन

क्या ऐसे पैटर्न को वास्तव में Microsoft से दिशानिर्देशों की आवश्यकता थी? काफी बुनियादी सामान लगता है।
डेव लॉरेंस

19
यह है बुनियादी सामान, लेकिन इसका मतलब यह नहीं है कि दिशा-निर्देशों उपयोगी नहीं हैं। यदि आप प्लेटफॉर्म को अच्छी तरह से नहीं जानते हैं, तो बुनियादी सामान प्राप्त करना काफी कठिन हो सकता है।
एरिक शियरबॉम

119

(सही किया गया) आधिकारिक दिशानिर्देश है, जैसा कि एरिक ने सुझाव दिया था।

जब मैं TrySomethingविधि देखता हूं , तो यह मान लेता हूं

  • फेंकता नहीं है
  • रिटर्न bool
  • अगर मुझे मूल्य की उम्मीद है, तो इसे 'आउट' पैरामीटर के माध्यम से लौटाया जाता है
  • वहाँ मौजूद Somethingविधि है, जो मुझे खुद को किसी भी अपवाद को संभालने की अनुमति देता है। (जेसी वेब द्वारा संपादित, सुझाया गया)

4
सुधार - इसकी आधिकारिक दिशानिर्देश है। एरिक का जवाब देखें।
नॉट्रो

8
+1 लेकिन मुझे एक 4 वीं उम्मीद भी है: यदि कोई TryFooविधि है, तो एक समान Fooविधि होगी जो मुझे किसी भी `को छोड़कर अपने आप को संभालने की अनुमति देती है। इन विधियों के हस्ताक्षर अलग-अलग होंगे, इसलिए उनके उपयोग अन्य कोड परिवर्तनों के बिना विनिमेय नहीं होंगे।
जेसी वेब वेब

1
@ जेसेवेब, इस ओर इशारा करने के लिए धन्यवाद। अगर आपने कोई आपत्ति नहीं की है, तो मैंने अपने उत्तर में अपनी टिप्पणी जोड़ दी है।
नॉट्रो

1
"नहीं फेंकता है" मुझे लगता है अतिरंजित। उदाहरण के लिए, Int32.TryParse (String, NumberStyles, IFormatProvider, Int32) स्टाइल पैरामीटर पसंद नहीं होने पर ArgumentException को फेंकता है।
जिर्का हनिका

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

8

मुझे लगता है कि आपको tryआगे बढ़ने के लिए उपयोग करना चाहिए । इससे कोई फर्क नहीं पड़ता कि कोई विधि कुछ मान लौटाती है या नहीं।

केस 1: यदि यह ठीक है, तो आप किसी तरह आगे बढ़ सकते हैं।

केस 2: यदि यह वापस नहीं आता है: यह अभी भी ठीक है; आप किसी अन्य तरीके से आगे बढ़ सकते हैं।

और यदि आप उस विधि के आउटपुट के रूप में कुछ मूल्य की उम्मीद करते हैं तो outपैरामीटर का उपयोग करें ।

उदाहरण

int value
if (dictionary.TryGetValue("key", out value))
{
    // Proceed in some way
}
else
{
    // Proceed in some other way
}

6

आपको विधि नाम में "कोशिश" का उपयोग करना होगा, जब आप इस तथ्य को प्रकट करना चाहते हैं कि विधि इनवोकेशन वैध परिणाम नहीं दे सकती है। .NET मानक के अनुसार, यह, एक फ़ंक्शन नहीं है जो अपवाद को उठाता है, लेकिन फ़ंक्शन जो कुछ VALIDया NON_VALID, प्रोग्राम के दृष्टिकोण से, मान लौटाता है ।

अंत में, यह सभी नामकरण सम्मेलन आप अपने समूह में उपयोग करने का निर्णय लेते हैं।


5

tryयदि आपके मेथडनेम में शामिल करना सुनिश्चित करें :

  • आप कोई अपवाद नहीं फेंकते
  • आपकी विधि में निम्नलिखित हस्ताक्षर हैं: bool TrySomething(input, out yourReturn)

इसलिए मूल रूप से अगर हम try-मैथोड का उपयोग करते हैं तो हमें केवल बूलियन परिणाम वापस मिलता है।

तो निम्नलिखित कोड किसी भी अपवाद को नहीं फेंकेंगे:

string input = "blabla";
int number;
if (int.TryParse(input, out number))
{
// wooohooo we got an int!
} else
{
//dooh!
}

जबकि यह कोड (और इस मामले में) अपवादों को फेंक सकता है:

string input = "blabla";
int number;
try
{
     number = int.Parse(input); //throws an exception
}
catch (Exception)
{
     //dooh!
}

कोड का उपयोग करने का तरीका कोड को सुरक्षित और अधिक रक्षात्मक तरीका है। इसके अलावा कोड स्निपेट # 2 निष्पादित करने के लिए अधिक प्रदर्शन लेता है यदि यह पूर्णांक नहीं है।


आपका कोड स्निपेट # 2 पढ़ना चाहिए int number = int.Parse(input);यदि आप चाहते हैं कि यह इस संदर्भ में अधिक सार्थक हो।
पियरे अरनौद

@PierreArnaud धन्यवाद, इसे बदल दिया!
फेबियन बिगलर

आप अभी भी int number;प्रयास ब्लॉक और number = ...असाइनमेंट से पहले घोषणा को याद कर रहे हैं ।
पियरे अरनौद

@PierreArnaud धन्यवाद, मैंने अब 'int नंबर' भी शामिल किया है।
फेबियन बिगलर

ध्यान दें कि आप अभी भी अपवादों को फेंक सकते हैं यदि अपवाद कुछ हद तक असंबंधित है, जो कि प्रदर्शन किया जा रहा है, जैसे कि TryLoadFile(path, out file)woah, RAM से बाहर। इसलिए फोन करने वाले को खराब रास्ते या पहुंच से इनकार करने की कोई त्रुटि नहीं होगी, लेकिन अजीब चीजों के लिए एक अपवाद जो गलत भी हो सकता है। और इसे दस्तावेज।
ल्यूक पुप्लेट

0

अंकल बॉब अपनी पुस्तक क्लीन कोड में नीचे उदाहरण देते हैं । जब भी हम एक अपवाद की उम्मीद करते हैं, तो हम Tryउपसर्ग का उपयोग विधि नाम से कर सकते हैं :

public void sendShutDown()
{
    try{
        tryToShutDown();
    } catch (DeviceShutDownError e) {
        logger.log(e);            
    }
}

और फिर (अनुकूलित):

private void tryToShutDown()
{
    //some code with no error handling, but
    //something might go wrong here
}

tryToShutDownविधि किसी भी त्रुटि हैंडलिंग नहीं है, क्योंकि वह की जिम्मेदारी है sendShutDownविधि।

TryParseमाइक्रोसॉफ्ट के पैटर्न स्वच्छ कोड दिशानिर्देश का कहना है कि है कि हम उत्पादन मानकों से बचना चाहिए उल्लंघन करती है।

यदि हम C # का नया संस्करण विकसित नहीं कर रहे हैं, तो हमें सभी Microsoft दिशानिर्देशों से चिपके रहने की आवश्यकता नहीं है। कभी-कभी वे सबसे अच्छे नहीं होते हैं।

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