2013-04-23 9 views
5

में बेहतर है लगता है मैं स्थिर कार्यों के निम्नलिखित समूह हैजो इस मामले, वापसी या रेफरी

यहाँ मैं संदर्भ द्वारा चर भेजा:

public static void ProcessEmailMessage(ref string HTML) 
     { 
      ModifyLinks(ref HTML); 
      AddFakeImage(ref HTML); 
     } 

     public static void ModifyLinks(ref string HTML) 
     { 
      //modify HTML links 
     } 


     public static void AddFakeImage(ref string HTML) 
     { 
      //adds an image to the HTML 
     } 

और यहाँ मैं मूल्य

द्वारा चर भेजा
public static string ProcessEmailMessage(string HTML) 
     { 
      HTML = ModifyLinks(HTML); 
      HTML = AddFakeImage(HTML); 
      return HTML; 
     } 

     public static string ModifyLinks(string HTML) 
     { 
      //modify HTML links 
      return HTML; 
     } 


     public static string AddFakeImage(string HTML) 
     { 
      //adds an image to the HTML 
      return HTML; 
     } 

जो एक और समझ में आता है, और वहाँ 2 के बीच किसी भी प्रदर्शन का अंतर है?

+2

** बी) ** ......... – I4V

उत्तर

8

बचें बाहर और रेफरी पैरामीटर का उपयोग कर यदि संभव हो तो।

तरीके लेने रेफरी और बाहर मापदंडों अधिक उपयोग करने के लिए थोड़ा कठिन हैं, तो आप एक चर घोषित करने के लिए परिणाम पकड़ की जरूरत है, और शब्दों को थोड़ा अधिक कठिन समझने के लिए है। प्रदर्शन अंतर (यदि कोई है) नगण्य होगा।

कोड विश्लेषण दृश्य स्टूडियो में इस मामले में उनके उपयोग के लिए एक चेतावनी फेंकना संभावना होगी।

एक अधिक विस्तृत विवरण के लिए http://msdn.microsoft.com/en-us/library/ms182131 देखें।

+1

बाहरी दस्तावेज़ का एक लिंक अच्छा है, लेकिन आपको यहां सारांश शामिल करना चाहिए। बाहरी लिंक तोड़ने पर SO उत्तर अभी भी उपयोगी होना चाहिए। – cdhowie

+0

@cdhowie: इसे इंगित करने के लिए धन्यवाद। मैंने पोस्ट को थोड़ा और सारांश भी शामिल करने के लिए संपादित किया है। – DeCaf

2

ref का उपयोग करते समय प्रदर्शन प्रदर्शन अधिक होने की संभावना है, क्योंकि यह चर के लिए असाइन करते समय संकेत के अतिरिक्त स्तर पर है। हालांकि, यह अंतर नगण्य होने की संभावना है।

मैं, रूपों है कि एक स्ट्रिंग लौटाने पसंद करेंगे के रूप में यह है कि क्या वास्तव में क्या हो रहा है की अधिक उदाहरण है, और आप श्रृंखला विधि की अनुमति देता है एक साथ कॉल यदि आप पसंद:

return AddFakeImage(ModifyLinks(HTML)); 

ref फ़ॉर्म के साथ आप एक चर घोषित करने के लिए कॉलिंग कोड बल दें, और उन्हें अन्यथा अन्यथा आवश्यकता नहीं हो सकती है। यह पठनीयता को प्रभावित करता है और अर्थहीन बॉयलरप्लेट कोड की घटनाओं को बढ़ाता है।

+0

तकनीकी रूप से एक चर दोनों मामलों में घोषित किया गया है, यह सिर्फ एक प्रश्न है कि प्रोग्रामर को इसके बारे में कभी भी पता होना चाहिए या नहीं। आपके द्वारा दिए गए कोड नमूने में एक अंतर्निहित अज्ञात स्थानीय चर है जो मौजूद है। अब, यह कहा गया है, इसके बारे में जानना अच्छा नहीं है, लेकिन प्रदर्शन दृष्टिकोण से, यह वास्तव में कोई अलग नहीं है। – Servy

+0

@ सर्वी जेआईटी-संकलित होने पर एक रजिस्टर होगा, लेकिन मैंने जो कोड उदाहरण दिखाया है वह मूल कोड की तुलना में एक कम स्थानीय घोषित करेगा। संक्षेप में आईएल 'ldarg.0 होगा; कहते हैं; कहते हैं; सेवानिवृत्त; '। तो नहीं, मूल कोड में अनुवाद तक कम से कम नहीं, "अतिरिक्त चर" है। (और वैरिएबल वास्तव में मूल कोड, केवल रजिस्टरों और मेमोरी स्थानों में मौजूद नहीं हैं। एक चर की अवधारणा देशी कोड की तुलना में उच्च-स्तर है।) – cdhowie

+0

दोनों मामलों में, चाहे कोई नाम स्थानीय हो या नहीं, जब आप वास्तविक प्रोसेसर निर्देश स्तर, दोनों को पंजीकृत होने की संभावना है, लेकिन दोनों संभावित रूप से स्मृति में किसी स्थान पर संग्रहीत किए जा सकते हैं यदि यह संभवतः नहीं है। – Servy

1

दोनों के बीच प्रदर्शन में अंतर बहुत मामूली हैं। यह पूरी तरह से वाक्यविन्यास की वरीयता का मामला है।

मानक सम्मेलनों एक पैरामीटर संदर्भ द्वारा पारित संशोधित करने के बजाय किसी नए स्ट्रिंग लौटने शामिल होगा। वहाँ कुछ अवसरों जहां यह उपयोग में आसान कर रहे हैं (आप एक नामित चर नहीं है अर्थात् जब, उदाहरण के लिए यदि आप एक विधि या संपत्ति के बजाय एक क्षेत्र के रिटर्न मान में पास करना चाहते हैं जब)।

1

कोई अंतर नहीं है लेकिन मैं "वापसी" के साथ जाऊंगा। यदि संभव हो तो "रेफरी" से बचने का प्रयास करें।

कारण आप अन्य कॉल का परिणाम पार करने से पहले एक चर घोषित करने के लिए नहीं होती है और आप श्रृंखला कॉल कर सकते हैं:

रेफरी के साथ

:

string modifyMe = GetMeString(); 
ModifyLints(ref modifyMe); 
AddFakeImage(ref modifyMe); 

तुलना में वापस जाने के लिए:

string result = AddFakeImage(ModifyLinks(GetMeString())); 
1

यदि आपको कई वस्तुओं को वापस करने की आवश्यकता है तो ref/out का उपयोग करें, यदि आप return के साथ ऐसा कर सकते हैं तो बस एक ओबीजे लौटाएं ect, return का उपयोग करें।
ref आपके कोड को अनावश्यक रूप से अस्पष्ट बनाता है और इस मामले में अनावश्यक लेखन ओवरहेड बनाता है।
आपको हमेशा अपना कोड सरल और अवलोकन करने की कोशिश करनी चाहिए।

1

मैं एक बिल्डर जो करता है की तरह कुछ पसंद करते हैं:।

नई EmailMessageProcessor (html) .WithModifiedLinks() WithFakeImages()।

तो कोई रेफ तर्क नहीं है, और सब कुछ encapsulated है।

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