ऐसे तरीके क्यों हैं जो असीमित मात्रा में पैरामीटर लेते हैं, अक्सर कम मापदंडों के साथ ओवरलोड को परिभाषित करते हैं?


36

उदाहरण के लिए, System.IO.Path.Combine.NET में विधि में निम्नलिखित अधिभार हैं:

Combine(params String[])
Combine(String, String)
Combine(String, String, String)
Combine(String, String, String, String)

अंतिम तीन का क्या मतलब है?

पहले वाला उन सभी को कवर करेगा, जैसे कि आप बारीकी से देखते हैं, यह paramsकीवर्ड का उपयोग करता है । पश्चगामी संगतता का तर्क केवल Combine(String, String)संस्करण को कवर करेगा , क्योंकि यह .NET 4 तक एकमात्र संस्करण था।

जवाबों:


56

मुख्य कारण प्रदर्शन के लिए है। "असीमित तर्क" वाक्य रचना चीनी वास्तव में स्ट्रिंग्स की एक सरणी है। यदि आप केवल एक स्ट्रिंग पास कर रहे हैं, तो केवल एक स्ट्रिंग के साथ एक सरणी क्यों बनाएं? खासकर अगर ~ 90% इस पद्धति के चालान 3 या उससे कम तर्कों के साथ होंगे, तो भारी वजन वाली वस्तु की कोई आवश्यकता नहीं है। यह स्मृति में थोड़ा हल्का है और प्रक्रिया को कम करने के लिए थोड़ा कम समय लगता है क्योंकि आपको विधि को परिभाषित करने के लिए लूप की आवश्यकता नहीं है। यदि आपके पास तीन तार हैं, तो आप तीन तार के लिए कोड करते हैं।


ध्यान देने वाली एक और बात यह है कि Combineशून्य या एक पथ खंडों के साथ गुजरने का भी कोई मतलब नहीं है, फिर भी paramsसंस्करण आपको ऐसा करने की अनुमति देता है।
मैथ्यू

4
अधिक संख्या के तर्कों को स्वीकार करने वाले अधिभार की संख्या का कारण पठनीयता के लिए नहीं है। यह प्रदर्शन के लिए है क्योंकि तार की एक सरणी उत्पन्न करके ओवरहेड की वजह से, और फिर उन्हें संसाधित करना। स्वीकार करने params string[]का कारण पठनीयता है।
ग्रेग बरगार्ड

2
प्रदर्शन वास्तव में कारण है, और मुझे विश्वास है कि यह विशेष रूप से तब होता है जब किसी कार्य को लूप के अंदर से बुलाया जाना अपेक्षित होता है । द सी # प्रोग्रामिंग लैंग्वेज के p.27 पर ब्रैड अब्राम्स के एनोटेशन के रूप में, थर्ड एडिशन कहता है: "[T] वह C # मॉडल प्रत्येक कॉल पर एक अतिरिक्त ऑब्जेक्ट एलोकेशन (युक्त सरणी) बनाता है। यह शायद ही कभी एक समस्या है, लेकिन भीतर में। -लूप प्रकार के परिदृश्य जहां यह अक्षम हो सकता है, हम मुख्यधारा के मामलों के लिए ओवरलोड प्रदान करने और paramsकेवल किनारे के मामलों के लिए अधिभार का उपयोग करने का सुझाव देते हैं । एक उदाहरण StringBuilder.AppendFormat()ओवरलोड का परिवार है। "
एलियाह कगन

3
@LowFlyingPelican मोनो और .NET फ्रेमवर्क समान नहीं हैं। यदि आप .NET फ्रेमवर्क संस्करण को देखते हैं , तो यह वास्तव में काफी अलग समाधान है।
एलेक्स

3
@LowFlyingPelican: .NET ढांचे के कारण है प्रदर्शन। उस विधि को लागू करने के लिए मोनो की वजह .NET के साथ एपीआई संगतता थी। उस तरीके को लागू करने का मोनो का कारण सादगी को लागू करना था (उनके कारण Microsoft की तुलना में काफी कम संसाधन थे)।
झोमिनल

4

सिंथेटिक चीनी।

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


3
परम के साथ, आप इसे पहले से ही शक्कर कर रहे हैं। msdn.microsoft.com/en-us/library/w5zay9db.aspx किसी सरणी की आवश्यकता नहीं है।
थॉमस जं

3
C # में, आपके पास एक बिंदु है, @ थोमस। हालाँकि, .NET बिना अन्य भाषाओं का भी समर्थन करता है params
कार्ल

@ThomasJunk यह लिंक मेरे लिए मृत है, दुर्भाग्य से, लेकिन मुझे यकीन है कि आप सही हैं क्योंकि मेरा C # औसत दर्जे का है। मैंने अभी कई भाषाओं के साथ कई पुस्तकालय देखे हैं जो सिर्फ क्लीनर कोड की अनुमति देने के लिए करते हैं।
को रोबोट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.