2008-12-03 19 views
8

से 2 या 3 उत्तरों प्राप्त करने के लिए आपका पसंदीदा अभ्यास मैं बस सोच रहा हूं कि अन्य डेवलपर किसी विधि से 2 या 3 उत्तरों प्राप्त करने के इस मुद्दे से कैसे निपटते हैं।सी # सिंटेक्स - विधि

1) लौटने के एक वस्तु []
2) एक कस्टम वर्ग
3) एक बाहर या प्रक्रिया विभिन्न कारकों के रेफरी खोजशब्द का उपयोग
4) एक सरल टपल <> सामान्य वर्ग
लिख सकते हैं या उधार (एफ #) वापसी http://slideguitarist.blogspot.com/2008/02/whats-f-tuple.html

मैं कुछ कोड पर काम कर रहा हूं जो डेटा रीफ्रेश करता है। रीफ्रेश करने वाली विधि से मैं वापस पास करना चाहता हूं (1) स्टार्ट टाइम रीफ्रेश करें और (2) एंड टाइम रीफ्रेश करें।
बाद की तारीख में मैं तीसरे मान को वापस लेना चाहता हूं।

विचार? इस विषय पर ओपन सोर्स .NET परियोजनाओं से कोई भी अच्छा प्रथा?

+0

मैंने "विधि हस्ताक्षर" टिप्पणी के लिए डेव आर को जीत दी। वह इस मुद्दे को जानना चाहता था कि मैं ऐसा होने से पहले भागने जा रहा था। जॉन का जवाब # 2 होगा। जॉन हमेशा शानदार है। – BuddyJoe

उत्तर

5

आपका प्रश्न इस संभावना को इंगित करता है कि आप भविष्य में अधिक डेटा लौटाएंगे, इसलिए मैं डेटा रखने के लिए अपनी कक्षा को लागू करने की अनुशंसा करता हूं।

इसका क्या अर्थ है कि आपका विधि हस्ताक्षर वही रहेगा, भले ही आप जिस ऑब्जेक्ट के आसपास गुजर रहे हैं उसका आंतरिक प्रतिनिधित्व अधिक डेटा को समायोजित करने के लिए बदलता है। पठनीयता और encapsulation कारणों के लिए यह भी अच्छा अभ्यास है।

+0

+1 भविष्य की जरूरतों के बारे में अच्छा बिंदु। कक्षा का उपयोग करके आप विधि या कॉलर को बदले बिना कक्षा में जोड़ सकते हैं। – BuddyJoe

10

दो के लिए, आम तौर पर उस से 4)

अधिक, 2)

+0

अभी तक मदद नहीं करता है, लेकिन .NET 4.0 में बीसीएल में एक सामान्य ट्यूपल क्लास शामिल होगा। –

+0

एक विशिष्ट माइक्रोसॉफ्ट समाधान की तरह लगता है - अभी तक एक और अस्पष्ट सुविधा जोड़ें। – dkretz

+1

अस्पष्ट? लोग संस्करण 1 के बाद से टुपल्स और एकाधिक रिटर्न वैल्यू के लिए पूछ रहे हैं। –

1

मैं बाहर का उपयोग करता है, तो यह केवल 1 या 2 अतिरिक्त चर (उदाहरण के लिए है, एक समारोह एक bool वास्तविक महत्वपूर्ण परिणाम है कि रिटर्न , लेकिन लॉजिंग उद्देश्यों के लिए फ़ंक्शन कितनी देर तक चलने के लिए बाहर पैरामीटर के रूप में लंबे समय तक)।

कुछ और जटिल के लिए, मैं आमतौर पर एक कस्टम संरचना/कक्षा बनाते हैं।

1

मुझे लगता है कि सबसे आम तरीका एक सी # प्रोग्रामर इस करना होगा आइटम आप एक अलग वर्ग में लौटना चाहते रैप करने के लिए किया जाएगा। इससे आपको आगे बढ़ने की सबसे लचीलापन मिल जाएगी, आईएमएचओ।

28

यह पूरी तरह से निर्भर करता है कि परिणाम क्या हैं। यदि वे एक दूसरे से संबंधित हैं, तो मैं आमतौर पर एक कस्टम कक्षा बनाउंगा।

यदि वे वास्तव में संबंधित नहीं हैं, तो मैं या तो आउट पैरामीटर का उपयोग करता हूं या विधि को विभाजित करता हूं। यदि कोई विधि तीन असंबंधित वस्तुओं को वापस करना चाहती है, तो शायद यह बहुत अधिक कर रही है। इसका अपवाद तब होता है जब आप किसी वेब-सेवा सीमा या किसी अन्य चीज़ पर बात कर रहे हों जहां "purer" API बहुत चिपचिपा हो सकता है।

+0

+1 इस पर सहमत हैं। जिस तरीके से वापस आते हैं> 2 अलग-अलग चीजें उचित रूप से बहुत अधिक तरीके से – drax

+0

> 1 असंबद्ध चीजें वैसे भी, विधियों के लिए कक्षा i/o के बड़े प्रशंसक +1 – annakata

+0

99% जब आप कस्टम स्ट्रक्चर बनाना चाहते हैं, कक्षा नहीं, लेकिन + 1 वैसे भी –

1

यह निर्भर करता है। एक आंतरिक केवल एपीआई के लिए, मैं आमतौर पर सबसे आसान विकल्प चुनूंगा। आम तौर पर यह बाहर है।

एक सार्वजनिक एपीआई के लिए, एक कस्टम वर्ग आमतौर पर अधिक समझ में आता है - लेकिन अगर यह कुछ काफी आदिम है, या समारोह के प्राकृतिक परिणाम बूलियन नहीं है (जैसे * .TryParse) मैं एक बाहर परम साथ रह सकते हैं। आप एक कस्टम क्लास भी कर सकते हैं जिसमें एक निहित कलाकार के साथ बूल भी हो सकता है, लेकिन यह आमतौर पर केवल अजीब होता है।

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

2

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

0

यदि 2, एक जोड़ी।

यदि 2 से अधिक कक्षाएं हैं।

+0

सिस्टम.Web.UI.Pair क्लास को कभी नहीं देखा। मान लीजिए कि आप आगे बढ़ते हुए वीएस -2010 में आने वाले टुपल्स का उपयोग करेंगे। – BuddyJoe

1

यदि आप रीफ्रेश स्टार्ट और एंड टाइम्स को रीफ्रेश करना चाहते हैं, तो संभावित क्लास या स्ट्रक्चर को इंगित करना है, जिसे शायद DataRefreshResults कहा जाता है। यदि आपका संभावित तीसरा मान रीफ्रेश से भी संबंधित है, तो इसे जोड़ा जा सकता है। याद रखें, एक संरचना हमेशा मूल्य से गुजरती है, इसलिए इसे ढेर पर आवंटित किया जाता है जिसे कचरा-संग्रहित करने की आवश्यकता नहीं होती है।

2

व्यक्तिगत रूप से, मुझे पैरा/रेफ पैराम्स से नफरत है, इसलिए मैं उस दृष्टिकोण का उपयोग नहीं करना चाहूंगा। साथ ही, अधिकांश समय, यदि आपको एक से अधिक परिणाम वापस करने की आवश्यकता है, तो आप शायद कुछ गलत कर रहे हैं।

तो यह वास्तव में अपरिहार्य है, तो आप शायद लंबे समय के लिए एक कस्टम वर्ग लेखन में सबसे खुश हो जाएगा। एक सरणी लौटाना आकर्षक है क्योंकि यह शॉर्ट टीर्म में आसान और प्रभावी है, लेकिन एक वर्ग का उपयोग करके आप भविष्य में रिटर्न प्रकार को बदलने के विकल्प को बिना स्ट्रीम डाउन स्ट्रीम के बारे में चिंता करने के विकल्प देते हैं। अगर कोई वापस लौटाए गए सरणी में दो तत्वों के क्रम को स्वैप करता है तो एक डिबगिंग दुःस्वप्न की संभावना की कल्पना करें ....

0

एक और समाधान नामित ऑब्जेक्ट संदर्भों का एक शब्दकोश वापस करना है। मेरे लिए, यह कस्टम रिटर्न क्लास का उपयोग करने के बराबर है, लेकिन अव्यवस्था के बिना। (और आरटीटीआई और प्रतिबिंब का उपयोग करना यह किसी भी अन्य समाधान के रूप में टाइपएफ़ जैसा है, यद्यपि गतिशील रूप से।)

+0

सीएलआर में आप जो भी करते हैं वह गतिशील रूप से टाइपएफ़ है, इसलिए यह ज्यादा नहीं कह रहा है! –

1

कुछ लोग दो मानों के लिए KeyValuePair का उपयोग करते हैं। हालांकि यह बहुत अच्छा नहीं है क्योंकि यह सिर्फ दो चीजों को Key और Value के रूप में लेबल करता है। बहुत वर्णनात्मक नहीं है। इसके अलावा इसे गंभीरता से इस होने से लाभ होगा कहा:

public static class KeyValuePair 
{ 
    public static KeyValuePair<K, V> Make(K k, V v) 
    { 
     return new KeyValuePair<K, V>(k, v); 
    } 
} 

जब आप एक बनाने के प्रकारों को निर्दिष्ट करने के लिए से बचाता है। जेनेरिक तरीके प्रकारों का अनुमान लगा सकते हैं, जेनेरिक क्लास कन्स्ट्रक्टर नहीं कर सकते हैं।

1
अपने परिदृश्य के लिए

आप (रेंज वैधता के लिए जाँच करता है) के साथ सामान्य रेंज {टी} वर्ग को परिभाषित कर सकते हैं।

यदि विधि निजी है, तो मैं आमतौर पर my helper library से टुपल्स का उपयोग करता हूं। सार्वजनिक या संरक्षित तरीके आमतौर पर हमेशा अलग हैं।

1

वापसी एक कस्टम प्रकार है, लेकिन एक वर्ग का उपयोग नहीं करते, एक struct का उपयोग करें - कोई स्मृति आवंटन/कचरा संग्रहण भूमि के ऊपर कोई कमियां का मतलब है।

0

यह प्रकार और परिणाम के अर्थ पर निर्भर करता है, साथ ही है कि क्या विधि निजी या नहीं है।

निजी तरीकों के लिए, मैं आमतौर पर बस अपनी कक्षा पुस्तकालय से एक टुपल का उपयोग करता हूं।

सार्वजनिक लिए/संरक्षित/आंतरिक तरीकों (यानी। निजी नहीं), मैं या तो बाहर पैरामीटर या एक कस्टम वर्ग का उपयोग करें।

उदाहरण के लिए, यदि मैं TryXYZ पैटर्न को कार्यान्वित कर रहा हूं, जहां आपके पास XYZ विधि है जो असफलता पर एक अपवाद फेंकता है और एक TryXYZ विधि जो बूलियन लौटाती है, TryXYZ आउट पैरामीटर का उपयोग करेगा।

यदि परिणाम क्रम-उन्मुख हैं (यानी।3 ग्राहकों को वापस करें जिन्हें संसाधित किया जाना चाहिए) तो मैं आम तौर पर किसी प्रकार का संग्रह वापस कर दूंगा।

इसके अलावा मैं आमतौर पर केवल एक कस्टम वर्ग का उपयोग करता हूं।

0

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

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