2013-08-26 9 views
6

जबकि मैं सी # में पुराने कोड पर काम कर रहा था, मुझे एक कोड आया जो मुझे परेशान करता था।एक असाइनमेंट अभिव्यक्ति लौटा रहा है

ज्यादा हलचल के बिना, यह कुछ इस तरह चला जाता है:

private string foo(string _text) 
{ 
    /* some manipulation on _text */ 
    return _text = Server.HtmlDecode(_text); 
} 

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

फिर भी मुझे यह अभी भी परेशान लगता है।

क्या यह सी # में एक ordinate अभ्यास है कि मुझे आदी होने की जरूरत है?

मेरे लिए अंतिम पंक्ति बस

return Server.HtmlDecode(_text); 

और नहीं एक काम अभिव्यक्ति हो जाना चाहिए। क्या कोई गहरी सी # सुविधा है जिसे मुझे पता नहीं है?

+0

'_text' निश्चित रूप से वैश्विक चर नहीं है, यह विधि का पैरामीटर है। –

+0

असाइनमेंट वास्तव में आवश्यक है? आप बाद में '_text' के साथ कुछ भी करने में सक्षम नहीं होंगे और यह संभवतः दायरे से बाहर निकलने की संभावना है। –

+0

@ एलसी। यही वह है जो मैं आंशिक रूप से पूछ रहा था; अगर इसका कोई मतलब था। जो मैंने एकत्र किया है उसके आधार पर, मुझे नहीं लगता है। –

उत्तर

10

जब मैं सी # में पुराने कोड में से कुछ पर काम कर रहा था, मैं एक कोड है जो मुझे खीझ होती है का सामना करना पड़ा।

यहां कई परेशानी की समस्याएं हैं। आइए उन सभी को सूचीबद्ध करें।

private string foo(string _text) 
{ 
    /* some manipulation on _text */ 
    return _text = Server.HtmlDecode(_text); 
} 

यह अंतिम पंक्ति जो मुझे

irks टिप्पणी भी irksome है। स्थानीय चर सस्ते हैं। _text के मूल मान को मिटाने की कोई आवश्यकता नहीं है। इसके बजाय, एक नया स्थानीय चर बनाओ और उसमें हेरफेर करें। इस तरह, जब आप विधि में किसी भी बिंदु पर डिबग कर रहे हैं तो आप जान सकते हैं कि मूल तर्क था। (याद रखें, मूल तर्क कचरा संग्रह के लिए योग्य हो सकता है जब चर वैरिएबल ओवरराइट हो जाता है, और इसलिए हमेशा के लिए खोया जा सकता है।)

एक बहुत अच्छे कारण के बिना औपचारिक पैरामीटर पर न लिखें। यह डीबग करना मुश्किल बनाता है।

असाइनमेंट ऑपरेटर का मान बाएं ऑपरेंड है, इसलिए मैं इसे देख सकता हूं।

यह इस मामले में सही है लेकिन सामान्य रूप से गलत है; सी # में असाइनमेंट ऑपरेटर का मान दाएं ऑपरेंड का मूल्य बाएं हाथ की ओर से जुड़े प्रकार में परिवर्तित होने के बाद का मान है। याद रखें, बाईं ओर की ओर कोई मूल्य नहीं हो सकता है; यह केवल एक लेखन संपत्ति हो सकती है।

क्या यह सी # में एक ordinate अभ्यास है कि मुझे आदी होने की जरूरत है?

यहां एक मानक अभ्यास है, हां। इस उपयोग के बारे में विचित्र क्या है (1) कि चुना गया चर औपचारिक है, और (2) कि असाइनमेंट return के साथ संयुक्त है।

string decoded = Server.HtmlDecode(_text); 
return decoded; 

अब आप सोच सकते हैं कि इस के सम्मोहक लाभ खत्म हो गया है कि तुम क्या सुझाव है:

return Server.HtmlDecode(_text); 

जवाब है:

यह कहना सी # में एक मानक अभ्यास हो रहा था जब विजुअल स्टूडियो 2013, विधि कॉल के लौटे हुए मूल्य की जांच करने के लिए डीबगर में कोई सुविधा नहीं थी! इसलिए यदि आप देखने के लिए क्या मूल्य HtmlDecode द्वारा वापस चाहते थे, जबकि डिबगिंग आप निम्नलिखित विकल्पों था: विधानसभा स्तर पर

  • डिबग और
  • HtmlDecode में कदम EAX की सामग्री को देखने और अपने राज्य की जांच
  • वर्तमान पद्धति से बाहर
  • चरण और यह जांच जो कुछ भी वापसी मान
  • को सौंपा गया था डीबगर में एक अन्यथा बेकार स्थानीय चर लिए परिणाम असाइन करें और स्थानीय तो जांच

चूंकि पहले तीन भयंकर हैं और आखिरी वाला आसान है, यही कारण है कि कई सी # प्रोग्रामर करने की आदत में हैं।

आप ऐसा करते हैं और उसके बाद करना नहीं का उपयोग स्थानीय जिसके परिणामस्वरूप, तो सी # संकलक जानता है कि यह एक आम बात है और जानबूझकर को दबा चेतावनी "आप एक स्थानीय आप फिर से कभी नहीं पढ़ने के लिए लिखा था"। यह केवल उस चेतावनी देता है यदि स्थानीय ने लगातार इसके लिए लिखा था, इस मामले में आप पहले से ही जानते थे कि यह संकलन समय पर क्या था और आमतौर पर इसे डीबगर में जांचने की आवश्यकता नहीं होती है।

उम्मीद है कि वीएस2013 अंततः इस अक्सर अनुरोधित सुविधा का समर्थन करता है, इस प्रकार का पैटर्न धीरे-धीरे गायब हो जाएगा।

+0

यदि आप कर सकते हैं, तो क्या आप इस टिप्पणी पर विस्तार करना चाहते हैं? "याद रखें, मूल तर्क कचरा संग्रह के लिए योग्य हो सकता है जब चर वैरिएबल ओवरराइट हो जाता है, और इसलिए हमेशा के लिए खोया जा सकता है" –

+0

@ जेस किम: यदि चर ओवरराइट किया गया है तो यह मामला हो सकता है कि तर्क में कोई लाइव संदर्भ शेष नहीं है और जीसी इसे इकट्ठा कर सकते हैं। – InBetween

0

नहीं, यह करने के लिए एक मूर्ख चीज है, और यह एक पंक्ति पर अधिक कोड क्रैमिंग के नाम पर पठनीयता को बलिदान देता है। यह लगभग हमेशा एक बुरी चीज है।

इस मामले में, यह वास्तव में कोई भी उद्देश्य प्रदान करता है। _text विधि का पैरामीटर है, और विधि निकाय में इसे बदलना कुछ भी नहीं करता है। विधि को पारित किया गया स्ट्रिंग संशोधित नहीं किया जाएगा।

0

उनके पास एक ही परिणाम है। यह बाद देखने के लिए सबसे आम है, या:

_text = Server.HtmlDecode(_text); 
return _text; 

(मैं या तो ऊपर या return Server.HtmlDecode(_text);, लेकिन नहीं जिस तरह से यह कोड को आप पढ़ रहे है की तरह)

+0

मैं 'सर्वर.एचटीएमडीकोड (_text) पसंद करता हूं;'। ऐसा कहा जा रहा है, मैं स्ट्रिंग मैनिप्लेशंस स्टोर करने के लिए स्थानीय रूप से घोषित स्ट्रिंग का उपयोग करना पसंद करता हूं। –

+0

ठीक है। मैं सिर्फ यह जानना चाहता था कि क्या कुछ अस्पष्ट सी # सुविधा थी जिसे मुझे पता नहीं था, या मुझे नहीं मिला। सी और लिस्प से आ रहा है, सी # पीछे बहुत सी काले जादूगर चल रहा है। –

0

नहीं, वहाँ कोई गहरा है इस मामले में सी # सुविधा, return कथन में असाइनमेंट करना बस व्यर्थ है। यह केवल उस कोड का पालन करना कठिन बनाता है जो कोड करना है।

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

+0

एक फॉलो-अप प्रश्न होगा यदि रिटर्न स्टेटमेंट _text के मूल्य, या 'असाइनमेंट अभिव्यक्ति का परिणाम' देता है। यह एक बहुत ही pedantic मुद्दा है। क्या सी # प्रोग्रामर 'मूल्य-का-असाइनमेंट-एक्सप्रेशन' का उपयोग करते हैं? मैंने इसे सी में पठनीयता के लिए टाला है लेकिन मैंने पर्याप्त कोड देखा है जो इसे थके हुए होने के लिए नियोजित करता है। –

+0

@JaceKim: 'वापसी' कथन अभिव्यक्ति का मान देता है, और असाइनमेंट अभिव्यक्ति का मान वह मान है जो असाइन किया गया था। मूल्य वापस लौटने के लिए वैरिएबल से नहीं पढ़ा जाता है। सी # प्रोग्रामर कभी-कभी असाइनमेंट के रूप में असाइनमेंट का उपयोग करते हैं, लेकिन अक्सर नहीं। इसका अधिकतर उपयोग तब किया जाता है जब विकल्प अधिक जटिल नियंत्रण संरचना होगी, उदाहरण के लिए जब कोई मान निर्धारित करता है कि एक लूप जारी रखना चाहिए; 'जबकि ((लाइन = स्ट्रीम। रीडलाइन())!= शून्य) ... ' – Guffa

+0

बहुत बहुत धन्यवाद; यह काफी स्पष्ट करता है। –

2

यह कथन अनावश्यक है और एक सी # अभ्यास नहीं है।

इसलिए जब ReSharper भी चेतावनी दे देंगे सक्रिय है कर

सौंपा किसी भी निष्पादन पथ में नहीं किया जाता है मूल्य

आप उल्लेख किया है, इस कोड को वास्तव में सबसे अच्छा अभ्यास

होगा
return Server.HtmlDecode(_text); 

इसके अलावा, चूंकि डीकोड _text पर हेरफेर का हिस्सा है, इसलिए यह असाइनमेंट को अलग करने और स्टेटमे को वापस करने के लिए मान्य होगा NT, एक ही ब्लॉक में तर्क रखने के लिए:

/* Other manipulations on _text */ 
_text = Server.HtmlDecode(_text); 

return _text; 
संबंधित मुद्दे