Console.WriteLine () और इतने सारे तर्क ओवरलोड की आवश्यकता है?


87

मैं प्रलेखन के माध्यम से ब्राउज़ कर रहा था और देखा कि इस Console.WriteLine()पद्धति में कई अतिभार थे। विशेष रूप से, मेरी जिज्ञासा और आंशिक भ्रम इनसे संबंधित है:

public static void WriteLine(string format, params object[] arg);
public static void WriteLine(string format, object arg0);
public static void WriteLine(string format, object arg0, object arg1);
public static void WriteLine(string format, object arg0, object arg1, object arg2);
public static void WriteLine(string format, object arg0, object arg1, object arg2, object arg3);

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

जवाबों:


102

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

delegate void E(string format, object o1);
E e = Console.WriteLine;

paramsअधिभार इस मामले को संतुष्ट नहीं करेगा, यह केवल काम करेंगे जब इस विशेष अधिभार मौजूद है

public static void WriteLine(string format, object arg0);

हालांकि यह एक बहुत गूढ़ मामला है। अधिक महत्वपूर्ण कारण निम्नलिखित हैं

  1. paramsकीवर्ड का समर्थन करने के लिए प्रत्येक CLI भाषा की आवश्यकता नहीं है । ओवरलोड होने से उन भाषाओं पर बोझ को कम करने की जरूरत होती है, जो कि एक सरल राइटलाइन कॉल के लिए मैन्युअल रूप से एक सरणी बनाने की आवश्यकता को हटा दें
  2. प्रदर्शन। कॉलिंग paramsअधिभार बलों फोन करने वाले एक सरणी आवंटित करने के लिए, भले ही वह संकलक द्वारा परोक्ष किया है। आवंटन .Net में सस्ते होते हैं लेकिन मुफ्त नहीं। इस तरह की छोटी चीजें विशेष रूप से आमतौर पर कहे जाने वाले तरीकों पर जल्दी से जुड़ जाती हैं Console.WriteLine। अन्य ओवरलोड होने से आम मामलों में इस आवंटन से बचने की अनुमति मिलती है

1
मैंने अपने उत्तर में विधि समूह के मामले के बारे में सोचा था, लेकिन मुझे पूरा यकीन है कि समूह रूपांतरण सी # 2.0 तक पेश नहीं किया गया था, जबकि राइटलाइन ओवरलोड कम से कम 1.1 पर वापस आ गया था।
— जाकेट

@jaket C # 2.0 में सुविधाजनक सिंटैक्स जोड़ा गया था। लेकिन अगर आप new E(Console.WriteLine)C # 1.
— CodesInChaos

5
क्या एरो एलोकेशन इस बात पर भी ध्यान देने योग्य है कि कंसोल कितना धीमा है।
— ब्रायन बोएचर

3
@ आइना यह गति नहीं है बल्कि आवंटन का संचय है जो समस्या है। GC सस्ता नहीं है और जटिल ऐप्स में GC अक्सर प्रभावी प्रदर्शन कारक है। अनावश्यक आवंटन के सामान्य स्रोतों को रोकना प्रदर्शन के लिए महत्वपूर्ण है
— JaredPar

38

अधिभार C ++ / CLI प्रोग्रामों की सुविधा के लिए है, जहां परमस कीवर्ड मौजूद नहीं है।


1
यह एक महान जवाब है, एक महान प्रश्न के लिए, IMHO, भी।
— उवे कीम

1
आह ... यह वास्तव में बहुत मायने रखता है। मुझ पर शर्म, C ++ मेरी पहली भाषा थी। :)
— बीके

3
मूल बातें पहली भाषा से शुरू होती हैं, चतुर जवाब दोस्त
— dbw

4

मुझे लगता है कि आप सभी लोग भूल रहे हैं कि Params को C # 2.0 में पेश किया गया था। इसलिए, अधिभार .NET 1.1 से भी मौजूद है, जब परमेस कीवर्ड नहीं था।


जकीत ने उल्लेख किया कि
— बीके

JaredPar के जवाब पर उनकी टिप्पणी पढ़ें। यही कारण है कि उन्होंने अपने उत्तर में परम स्पष्टीकरण को शामिल नहीं किया।
— बीके

@ नोबैकोड, यह सच है कि उसने किया लेकिन यह अनुमान है (जैसे मैंने इसे कैसे पढ़ा)। मैं यहां एलन को एक उत्थान देता हूं (जितना कम उतना मूल्य है) क्योंकि उन्होंने इसे अधिक प्रत्यक्ष मनोर में कहा था।
— फ्रैंक वी

1
इस लिंक से Params कीवर्ड .Net 1.1 में भी मौजूद है
— श्रीराम सक्थिवेल

1

मैं प्रश्न पूछा पहले से ही अच्छी और से व्याख्यात्मक उत्तर दिए गए हैं लगता है JaredPar और jaket लेकिन एक बिंदु मैं भी प्रासंगिक हो सकता है क्या सोचते हैं,

मुझे लगता है कि उपयोगकर्ताओं के लिए उपयोग और स्वतंत्रता में आसानी से उपरोक्त कार्यों में से किसी का भी उपयोग वहां की आवश्यकता के अनुसार होता है, इस तरह, वहां जरूरत अधिक सुविधाजनक होती है, फिर एक सरणी बनाने के लिए उन्हें थोपना, जब उन्हें वास्तव में इसकी आवश्यकता नहीं होती है।

मुझे लगता है कि पुराने दिनों में भी जब मैंने C # सीखना शुरू किया था तो मैंने शायद ही सरणियों का उपयोग किया था और सरणियों का उपयोग करना मेरे लिए एक जटिल काम था, इसे असाइन करना और फिर उन्हें उचित मूल्यों के साथ आरंभ करना वास्तव में जटिल और समय लेने वाला भी था ...


3
लेकिन विचार paramsयह है कि आप या तो एक सरणी पास कर सकते हैं, या स्पष्ट रूप से सभी तर्क लिख सकते हैं। की तरह एक विधि void do(params object[])या तो साथ कहा जा सकता है do(new object[] {"some", "stuff"}या do("some", "stuff")। मुझे नहीं लगता कि आपकी बात यहां बिल्कुल लागू है।
— क्रोल्टन

2
@ क्रोल्टन लेकिन क्या आप बता सकते हैं कि कितने शुरुआती लोग वास्तव में इसका मतलब paramsजानते हैं और उन्हें पता है कि अगर paramsवहाँ है तो आप अल्पविराम के रूप में चर को अलग कर सकते हैं।
— dbw

1
@ क्रोल्टन मैं भी paramsलंबे समय से इस तरह का उपयोग करने के बारे में नहीं जान रहा था और विजुअल स्टडीज में प्रदर्शित सहायता अनुभाग में अगर मुझे array []तर्क मिलता है तो मैं तर्क के रूप में सरणी की आपूर्ति करने के बारे में
— सोचूंगा

-3

यह वास्तव में इस तरह के प्रदर्शन के मुद्दे के लिए नहीं है। हालाँकि, प्रयोज्य में वृद्धि इसके पीछे एक वैध कारण है।

नीचे दिया गया कोड आपको एक छोटा सा विवरण देगा।

public class TipCalculator {
    private const double tipRate = 0.18;
    public static int Main(string[] args) {
        double billTotal;
        if (args.Length == 0) {
            Console.WriteLine("usage: TIPCALC total");
            return 1;
        }
        else {
            try {
                billTotal = Double.Parse(args[0]);
            }
            catch(FormatException) {
                Console.WriteLine("usage: TIPCALC total");
                return 1;
            }
            double tip = billTotal * tipRate;
            Console.WriteLine();
            Console.WriteLine("Bill total:\t{0,8:c}", billTotal);
            Console.WriteLine("Tip total/rate:\t{0,8:c} ({1:p1})", tip, tipRate);
            Console.WriteLine(("").PadRight(24, '-'));
            Console.WriteLine("Grand total:\t{0,8:c}", billTotal + tip);
            return 0;
        }
    }
}

कृपया अधिक जानकारी के लिए लिंक: http://msdn.microsoft.com/en-us/library/aa324774(v=vs.71).aspx देखें।


9
यह कैसे प्रयोज्यता बढ़ाता है? पहली विधि अन्य चार की तरह ही काम कर सकती है। आप मुझे दस्तावेज़ीकरण का उल्लेख कर रहे हैं, जबकि मैंने अभी कहा था कि मैं प्रलेखन के माध्यम से देख रहा था। मुझे पता है कि उस विधि का उपयोग कैसे किया जाता है और कैसे उपयोग किया जाता है (मैं किसी भी तरह से C # के लिए नया नहीं हूं)। लेकिन पहले एक के ऊपर अतिरिक्त अधिभार की आवश्यकता क्यों है।
— बीके

मुझे लगता है कि उसका क्या मतलब है, केवल एक पैरामीटर पास करने के लिए, इसे रखने के लिए एक सरणी बनाने और इसे विधि में पास करने का कोई मतलब नहीं है - सिर्फ एक पैरामीटर क्यों नहीं पारित करें? ऐसा कुछ करने का मेरा कारण होगा
— KingTravisG

@ SCassidy1986: आप जब यह एक पैरामीटर विधि है, जब तक आप करना चाहते हैं सरणी नहीं बनाते हैं। संकलक स्वचालित रूप से एक बना देगा। यह दोनों ही दृष्टियों और इस प्रश्न का बिंदु है।
— मैगस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.