2010-04-29 10 views
18

मेरी टीम के किसी ने एक खाली पकड़ खंड में 'चर नहीं उपयोग' चेतावनी को ठीक करने का प्रयास किया।सी # कंपाइलर चेतावनी देना चाहिए, लेकिन नहीं?

try { ... } catch (Exception ex) { } 

->ex के बारे में कोई चेतावनी नहीं दी जा रही है। अब तक सब ठीक है.

ठीक कुछ इस तरह था:

try { ... } catch (Exception ex) { string s = ex.Message; } 

यह देखकर, मैंने सोचा था कि "बस महान है, इसलिए अब संकलक के बारे में s नहीं किया जा रहा शिकायत करेंगे।"

लेकिन ऐसा नहीं है! कोड के उस टुकड़े पर कोई चेतावनी नहीं है और मैं यह नहीं समझ सकता कि क्यों। कोई विचार?

पीएस। मुझे पता है कि सभी खंड जो म्यूट अपवाद एक बुरी चीज हैं, लेकिन यह एक अलग विषय है। मुझे यह भी पता है कि प्रारंभिक चेतावनी इस तरह कुछ करने से बेहतर हटा दी जाती है, यह बिंदु भी नहीं है।

try { ... } catch (Exception) { } 

या

try { ... } catch { } 
+0

युक्ति: इसके बजाय 'पकड़ (अपवाद)' का उपयोग करें। यदि आप डीबगर में अपवाद देखना चाहते हैं, तो '$ अपवाद' का उपयोग करें। – Brian

उत्तर

25

इस मामले में संकलक का पता लगाता है कि s लिखा लेकिन नहीं पढ़ रहा है, और जानबूझ कर चेतावनी को दबा क्योंकि सी # एक कचरा-एकत्र भाषा है

कारण है। , यह विश्वास है या नहीं।

कैसे आपको लगता है कि समझ सकता हूँ?

ठीक है, निम्नलिखित पर विचार करें।

आपके पास एक ऐसा प्रोग्राम है जो एक विधि DoIt() को कॉल करता है जो एक स्ट्रिंग देता है। आपके पास DoIt() के लिए स्रोत कोड नहीं है, लेकिन आप डीबगर में जांच करना चाहते हैं कि इसका रिटर्न वैल्यू क्या है।

अब आपके विशेष मामले में आप अपने साइड इफेक्ट्स के लिए DoIt() का उपयोग कर रहे हैं, न कि इसके वापसी मूल्य। तो अगर आप कहते हैं कि

DoIt(); // discard the return value 

अब आप अपने कार्यक्रम डिबगिंग रहे हैं और आप क्योंकि (समय डिबगर टूटता छदाम के लिए कॉल के बाद से) छदाम के रिटर्न मान (और यह वहाँ नहीं है को देखने के लिए जाना), कचरा कलेक्टर पहले से ही अप्रयुक्त स्ट्रिंग साफ़ कर सकता है।

और वास्तव में प्रबंधित डीबगर में "पिछली विधि कॉल द्वारा लौटाई गई चीज़ को देखने" की कोई सुविधा नहीं है। अप्रबंधित सी ++ डीबगर में वह सुविधा है क्योंकि यह ईएक्स रजिस्टर देख सकता है जहां छोड़ा गया वापसी मूल्य अभी भी बैठा है, लेकिन आपके पास प्रबंधित कोड में कोई गारंटी नहीं है कि लौटाया गया मूल्य अभी भी जीवित है अगर इसे छोड़ दिया गया हो।

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

गरीब सी # डेवलपर क्या करना है? एक स्थानीय चर बनाओ, परिणाम स्थानीय चर में स्टोर करें, और फिर डीबगर में स्थानीय की जांच करें। डीबगर सुनिश्चित करता है कि स्थानीय लोग कचरे को आक्रामक रूप से एकत्र नहीं करते हैं।

तो आप ऐसा करते हैं और फिर संकलक आपको चेतावनी देता है कि आपके पास स्थानीय है जो केवल पर लिखा गया है और कभी नहीं पढ़ता है क्योंकि पढ़ना करने वाली चीज प्रोग्राम का हिस्सा नहीं है, यह वहां मौजूद डेवलपर है डीबगर देख रहे हैं। यह एक बहुत परेशान उपयोगकर्ता अनुभव है! इसलिए हम उस स्थिति का पता लगाते हैं जहां गैर-स्थिर मान को स्थानीय चर या फ़ील्ड पर असाइन किया जा रहा है जो कभी भी पढ़ता है, और उस चेतावनी को दबाता है। यदि आप अपना कोड बदलते हैं तो इसके बजाय यह string s = "hello"; कहता है तो आपको चेतावनी मिलना शुरू हो जाएगा क्योंकि संकलक कारण, ठीक है, यह संभवतः डीबगर की सीमाओं के आसपास काम करने वाला कोई व्यक्ति नहीं हो सकता है क्योंकि मान है इसे पहले से डीबगर के बिना डेवलपर द्वारा पढ़ा जा सकता है।

यह बताता है कि एक। ऐसे कई अन्य मामले हैं जहां हम चर के बारे में चेतावनियों को दबाते हैं जिन्हें कभी नहीं पढ़ा जाता है; एक detailed exegisis of all the compiler's policies जब हम चेतावनियों की रिपोर्ट करते हैं और जब हम मुझे लिखने में काफी समय नहीं लेते हैं, तो मुझे लगता है कि मैं इसे छोड़ दूंगा।

1

मुझे लगता है कि जिस व्यक्ति ने यह जवाब देती है कैसे संकलक काम करता है में कुछ अंतर्दृष्टि की आवश्यकता होगी। हालांकि, FxCop की तरह कुछ शायद इसे पकड़ लेगा।

9

परिवर्तनीय एस का उपयोग किया जाता है ... ex.Message का संदर्भ रखने के लिए। यदि आप सिर्फ स्ट्रिंग था; आपको चेतावनी मिलेगी।

+0

मुझे लगता है कि आप सही हैं। "ऑब्जेक्ट ए = स्ट्रिंग। लक्षण;" एक कंपाइलर चेतावनी भी नहीं दिखाता है। ऐसा लगता है कि केवल मूल्य प्रकारों (शून्य नहीं) –

+0

पर चेतावनी देना है, लेकिन यदि आप केवल एक चर निर्दिष्ट करते हैं और इसका कभी भी उपयोग नहीं करते हैं, तो संकलक कहता है कि 'चर' x 'असाइन किया गया है लेकिन इसका मान कभी भी उपयोग नहीं किया जाता है' –

+0

यह केवल होता है कुछ प्रकार, मुझे मानते हैं कि मूल्य प्रकार विशेष रूप से। जैसे 'बूल'। लेकिन 'स्ट्रिंग' जैसे संदर्भ प्रकार पारंपरिक रूप से शिकायत नहीं करेंगे। –

1

गुण केवल विधियां हैं, और कुछ भी ऐसा कोड डालने से रोक नहीं रहा है जो पूर्व में कुछ करता है। मैसेज प्रॉपर्टी। इसलिए, जब आप एस के साथ कुछ भी नहीं कर रहे हैं, तो पूर्व में कॉल करें। संदेश का संभावित मूल्य हो सकता है ....

0

स्टेटिक विश्लेषण कुछ हद तक सीमित है जो इसे पूरा कर सकता है। (हालांकि एरिक ने यह नहीं बताया क्योंकि यह इस मामले में नहीं जानता है।)

.NET 4 में नए कोड अनुबंध स्थिर जांच को काफी बढ़ाते हैं और एक दिन मुझे यकीन है कि आपको स्पष्ट बग के साथ और सहायता मिलेगी इस तरह।

यदि आपने कोड अनुबंधों का प्रयास किया है तो आपको पता चलेगा कि आपके कोड का एक विस्तृत स्थिर विश्लेषण करना आसान नहीं है - यह प्रत्येक संकलन के कुछ मिनट बाद फेंक सकता है। स्थिर विश्लेषण कभी संकलन समय पर इस तरह की हर समस्या को खोजने में सक्षम होगा? शायद नहीं: http://en.wikipedia.org/wiki/Halting_problem देखें।

+1

इस विशेष मुद्दे में रोकथाम की समस्या के साथ कुछ भी नहीं करना है। संकलक चेतावनी की स्थिति का पता लगाता है और जानबूझ कर रिपोर्टिंग को दबा देता है। –

+0

ठीक है, thx। मुझे लगता है कि वर्तमान संकलक में स्थिर विश्लेषण कितना दूर हो रहा था, यह नहीं था कि यह कर रहा था और फिर इसे छोड़कर! हेलिंग स्टेट लिंक सिर्फ स्थिर विश्लेषण की कठिनाई को स्पष्ट करने के लिए था। –

1

यह वास्तव में एक सिंगल इंस्टेंस और कोने केस को काम करने के लिए एक कंपाइलर का काम नहीं है जब एक चर का उपयोग किया जा सकता है या नहीं। कुछ स्पॉट करने में आसान हैं, कुछ अधिक समस्याग्रस्त हैं। सावधानी के पक्ष में एरिंग करना समझदारी की बात है (विशेष रूप से जब चेतावनियों को त्रुटियों के रूप में माना जा सकता है - कल्पना करें कि सॉफ़्टवेयर संकलित नहीं हुआ है क्योंकि संकलक ने सोचा था कि आप किसी चीज का उपयोग नहीं कर रहे थे)। माइक्रोसॉफ्ट संकलक टीम विशेष रूप से कहते हैं:

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

- Ed Maurer, Development Lead, Managed Compiler Platform

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