2009-03-09 23 views
13

कोई कोडिंग की कल्पना निम्नलिखित:सी # संकलक संवर्धन सुझाव

string s = "SomeString"; 
s.ToUpper(); 

हम सभी जानते हैं कि ऊपर के उदाहरण में, "toupper()" विधि करने के लिए कॉल व्यर्थ है क्योंकि लौटे स्ट्रिंग बिल्कुल नहीं संभाला है । लेकिन फिर भी, बहुत से लोग उस गलती को करते हैं और खुद को पूछकर समस्या का निवारण करने का प्रयास करने में समय व्यतीत करते हैं "मेरे 'चर के पूंजीकृत क्यों नहीं हैं" ????

तो क्या यह बहुत अच्छा नहीं होगा अगर "एट्रिब्यूट()" विधि पर लागू किया जा सकता है जो कि वापसी ऑब्जेक्ट को संभाला नहीं जाता है तो एक कंपाइलर त्रुटि उत्पन्न करेगा? निम्नलिखित की तरह कुछ:

[MustHandleReturnValueAttribute] 
public string ToUpper() 
{ 
… 
} 

इस कोड के लिए आदेश सही ढंग से उपयोगकर्ता को संकलित करने के इस तरह वापसी मान संभाल करने के लिए होता है, तो: यह एकदम साफ आप करना होगा कि बनाना होगा

string s = "SomeString"; 
string uppers = s.ToUpper(); 

मुझे लगता है कि रिटर्न वैल्यू को संभालें अन्यथा कोई फंक्शन कॉल करने पर कोई बिंदु नहीं है।

स्ट्रिंग उदाहरण के मामले में यह एक बड़ा सौदा नहीं हो सकता है लेकिन मैं अन्य वैध कारणों के बारे में सोच सकता हूं कि यह आसान क्यों होगा।

आप क्या सोचते हैं?

धन्यवाद।

+0

मैंने इसे पहले किया है, +1 –

+0

@Rene: मान्य बिंदु, +1 – Codex

उत्तर

8

क्या कोई इसके साइड इफेक्ट्स के लिए एक विधि को कॉल करता है, इसके वापसी मूल्य के लिए, या दोनों के लिए? "शुद्ध" फ़ंक्शंस (जिनके पास कोई प्रभाव नहीं है और केवल वापसी मान की गणना करने के लिए सेवा प्रदान करता है) आपके द्वारा वर्णित त्रुटि के प्रकार को समाप्त करने के साथ-साथ कुछ संभावित अनुकूलन/विश्लेषण सक्षम करने के लिए, दोनों को एनोटेट करना अच्छा होगा। शायद एक और 5 वर्षों में हम यह देखेंगे।

(ध्यान दें कि एफ # संकलक किसी भी समय आप परोक्ष एक वापसी मान उपेक्षा चेतावनी देगा। 'उपेक्षा' समारोह के लिए इस्तेमाल किया जा सकता है जब आप स्पष्ट रूप से इसे अनदेखा करना चाहते हैं।)

+0

'शुद्धता' एनोटेशन की धारणा को सामान्य बनाना अच्छा होगा, क्योंकि तब संकलक अधिक अनुकूलित करने में सक्षम हो सकता है। वास्तव में सी ++ कॉन्स कीवर्ड की तरह। – Thomas

+0

इसके अलावा, एक [शुद्ध] एनोटेशन जोड़ना उन समस्याओं को हल करेगा जो लोग नीचे के बारे में बात करते हैं जहां वे कार्य कहते हैं और दुष्प्रभावों की परवाह नहीं करते हैं। मुझे लगता है कि लेखक वास्तव में क्या प्राप्त कर रहा था। – Mason

0

कम से कम एक कंपाइलर-चेतावनी उपयोगी होगी। शायद वे सी # 4.0 (डिजाइन-बाय-कॉन्ट्रैक्ट) के लिए कुछ समान जोड़ते हैं।

+0

मैं एक त्रुटि पर एक चेतावनी पसंद करूंगा। यदि आप सिर्फ एक साथ कोड फेंक रहे हैं, तो आप नहीं चाहते हैं कि यह आपको कोड चलाने से रोक सके, उदाहरण के लिए। – Andy

+0

अनुबंध द्वारा डिजाइन पूर्व शर्त, पोस्टकंडिशन और इनवेरिएंट के बारे में है। इस बात को सेट करने के बारे में नहीं कि कैसे लौटाए गए मूल्यों का उपयोग/उपयोग किया जाना चाहिए। –

0

यह एक चेतावनी के लिए वारंट नहीं है या प्रज्ञा। ऐसे कई स्थान हैं जहां इसका परिणाम छोड़ना है, और मैं संकलक से चेतावनी/त्रुटि प्राप्त करने से काफी नाराज हूं क्योंकि विधि को कुछ डॉज विशेषता के साथ सजाया गया था।

इस प्रकार की 'चेतावनी' को आईडीई के संपादक में एनोटेट किया जाना चाहिए, जैसे गटर पर एक छोटा आइकन "चेतावनी: वापसी मूल्य को छोड़ना" या इसी तरह।

2

मुझे यकीन नहीं है कि मुझे यह पसंद है। मैंने कई विधियों को बुलाया है जो एक मूल्य लौटाते हैं जिसे मैं कैप्चर नहीं करना चुनता हूं। कुछ प्रकार का डिफॉल्ट जोड़ना (संकलक एक चेतावनी उत्पन्न करता है जब रिटर्न वैल्यू को संभाला नहीं जाता है) बस मुझे गलत लगता है।

मैं मानता हूं कि सुझाए गए लाइनों के साथ कुछ नए प्रोग्रामर की मदद कर सकता है लेकिन गेम में इस बिंदु पर एक विशेषता जोड़ना केवल मौजूदा मौजूदा निकाय के सापेक्ष बहुत कम तरीकों को प्रभावित करेगा। वही जूनियर प्रोग्रामर इस मुद्दे के चारों ओर अपने सिर को कभी नहीं प्राप्त करेगा जब उनके अधिकांश अनचाहे वापसी मान संकलक द्वारा ध्वजांकित नहीं किए जाते हैं।

शायद अच्छा तरीका हो सकता है जब घोड़े बार्न से बाहर हैं।

+0

एक विशेषता जोड़ना थोड़ा अधिक होगा, लेकिन मुझे नहीं लगता कि संकलक "कोड का कोई प्रभाव नहीं" चेतावनी क्यों दे सकता है। –

+0

मेरे लिए मुद्दा यह है कि आप एक वैध निर्माण कर रहे हैं और इसे चेतावनी उत्पन्न कर रहे हैं। हां, यह भ्रमित हो सकता है लेकिन मैं उन विधियों का उपयोग करता हूं जो कैप्चर किए गए मूल्यों को कैप्चर किए बिना मूल्यों को वापस लौटाते हैं। – andleer

+0

बूल DoStuff() {doStuff(); अगर (सफलता) सच हो जाती है; विवरण झूठा है; } अब DoStuff() को कॉल करते समय कई बार मुझे सफलता या विफलता की परवाह नहीं है। परिणामों की जांच करने की कोई ज़रूरत नहीं है, उन्हें लगता है कि वे वापस आ गए हैं। अन्य बार, यकीन है, मुझे परवाह है। – andleer

6

यदि आपके पास रिशेर्पर है तो यह आपके लिए इस तरह की चीजों को हाइलाइट करेगा। अनुशंसा बहुत अधिक resharper की सिफारिश कर सकते हैं, यह विशेष रूप से refactoring के आसपास बहुत उपयोगी आईडीई जोड़ों है।

http://www.jetbrains.com/resharper/

1

मैं वास्तव में एक struct या [अपरिवर्तनीय] के रूप में वर्ग ध्वज के लिए एक रास्ता पसंद करते हैं, और इस तरीकों अपरिवर्तनीय वस्तुओं पर उनकी वापसी मान का उपयोग किए बिना कहा जाता है के लिए (एक चेतावनी के साथ) स्वचालित रूप से प्रबंधित होगा। यह संकलन के बाद संकलक से संकलक द्वारा ऑब्जेक्ट की रक्षा भी कर सकता है।

यदि वस्तु वास्तव में एक अपरिवर्तनीय वस्तु है, तो वास्तव में इसे संभालने का कोई तरीका नहीं होगा। यह अन्य सामान्य गलतियों को पकड़ने के लिए संभावित रूप से कंपाइलर्स द्वारा भी उपयोग किया जा सकता है।

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

1

मेरे पास सभी printf() कॉल पर डालने (शून्य) डालने के लिए फ्लैशबैक हैं क्योंकि मुझे रिटर्न मूल्य को अनदेखा करने के बारे में बंद करने के लिए लिंट नहीं मिल सका।

ऐसा कहा जाता है, ऐसा लगता है कि यह कार्यक्षमता संकलक के बजाए कुछ कोड चेकर टूल में होना चाहिए।

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