2009-10-08 12 views
6

मेरे पास एक ऐसा कार्य है जिसे दो तारों को वापस करने की आवश्यकता है। मैं यह करने के दो अलग अलग तरीकों पर विचार किया है:रिटर्न KeyValuePair या सी # में चर का उपयोग करें?

string first = "this is first"; 
string second = "this is second"; 
KeyValuePair<string, string> ReturnPair() 
{ 
    return new KeyValuePair<string, string>(first, second); 
} 
string ReturnOne(out string other) 
{ 
    other = second; 
    return first; 
} 

मैं KeyValuePair <> दृष्टिकोण का उपयोग करना चाहते हैं, लेकिन मुझे लगता है कि मैं जिस उद्देश्य के लिए इस वस्तु बनाया गया था दुरुपयोग कर रहा हूँ।

मेरे सवालों का:

  1. वहाँ इस उदाहरण में 2 तार वापस जाने के लिए एक बेहतर तरीका है?
  2. क्या KeyValuePair को वापस करने में कुछ गड़बड़ है?

उत्तर

20

वहाँ जबकि कुछ भी नहीं KeyValuePair लौटने के साथ तकनीकी रूप से गलत, बात आप लौट रहे हैं नहीं धारणात्मक एक "कुंजी-मान" जोड़ी है। यह एक साधारण जोड़ी है।

वैकल्पिक रूप से आप Tuple का उपयोग कर सकते हैं, जो .NET 4.0 में उपलब्ध है या इस बीच, your own structure घोषित करें।

मैं आमतौर पर ट्यूपल्स लौटने के लिए out पैरामीटर के खिलाफ सलाह देता हूं। खासकर जब आप LINQ और कार्यात्मक भाषा संरचनाओं का उपयोग कर रहे हैं, out पैरामीटर के साथ काम करना कठिन है।

+0

सही, जो चीज मैं लौट रहा हूं वह एक KeyValuePair नहीं है और इसलिए मैं उस निर्माण का उपयोग करने में संकोच कर रहा हूं। बात एक ट्यूपल है। आपके विचारों के लिए धन्यवाद। – Guy

3

मेरे व्यक्तिगत राय होगी

void ReturnTwo(out string one, out string two) 
{ 
    // do assignments 
} 

मुझे लगता है यह इसे और अधिक क्या वापसी मान हैं पर स्पष्ट कर देता है।

6

यदि डेटा तार्किक रूप से एक साथ है, लेकिन कोई तर्कसंगत रूप से दूसरे की कुंजी नहीं है, तो मैं इसे एक नए प्रकार को परिभाषित करता हूं जो इसे समाहित करता है।

यदि कोई दूसरे की कुंजी है, तो मैं NameValuePair का उपयोग करूंगा।

+0

मैं यह भी कहने जा रहा था। यदि, उदाहरण के लिए, आप किसी व्यक्ति के दो नामों का प्रतिनिधित्व कर रहे हैं, तो आपके पास फर्स्टनाम और लास्टनाम संपत्ति वाला क्लास हो सकता है। इससे भविष्य में पूर्णनाम प्राप्तकर्ता बनाने की संभावना खुलती है। – StriplingWarrior

6

यह मेरी पसंदीदा विधि होगी। KeyValuePair इतना verbose है।

String[] ReturnPair() 
{ 
    return new [] { first, second }; 
} 
+0

हाहा मजाकिया .. +1 – nawfal

0

जवाब की एक किस्म के साथ एक समान सवाल ही नहीं है: How do you return two values from a single method?

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

1

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

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