2010-10-21 17 views
13

यह एक बहुत ही बुनियादी सवाल है, और यदि मैं जो करने की सोच रहा हूं वह जटिल/शामिल है, तो मुझे उम्मीद नहीं है कि आप विस्तार से जाएं ... मैंने पढ़ा है कि इसमें structs या हैश या कुछ अन्य शामिल हो सकते हैं डरावनी प्रक्रिया मैं अभी तक नहीं मिला है। यदि हां, तो मुझे यकीन है कि यह मुझे जल्द ही मिल जाएगा।क्या सी # एकाधिक रिटर्न मानों का समर्थन करता है?

सीखने के वर्ग, विधियों और वापसी मूल्यों पर काम करना।

मैं अपनी कक्षा/विधि वर्तमान घंटे और मिनट वापसी करना चाहता हूं। वास्तव में काफी सरल है। क्या यह सही ढंग से, या ठीक से बनाया गया है?

class MyClass 
{ 
    public int GetHour (int hr, int min) 
    { 
     DateTime dt = DateTime.Now; 
     int hour = dt.Hour; 
     int minute = dt.Minute; 

     return hour; 
     return minute; 

    } 
} 

और, Main() से बुला: एम आई बंद: कुछ त्रुटियों (No overload for method और Unreachable code detected)

static void Main (string[] args) 
{ 
    MyClass mc = new MyClass(); 
    Console.WriteLine ("Hour: {0} \n Minute: {1}", mc.GetHour()); 
    Console.ReadLine(); 
} 

प्रश्न है हो रही है?

+1

संक्षिप्त उत्तर: नहीं, आप सरणी, सूची, शब्दकोश, या किसी भी संग्रह –

+0

आप 'पर DateTime.Now' क्यों एकत्र नहीं करते में एक से अधिक मान लौट सकते हैं' बजाय mc' और उसके गुणों का उपयोग करें? – BrunoLM

+0

संभावित डुप्लिकेट [मैं सी # में किसी फ़ंक्शन से एकाधिक मान कैसे वापस कर सकता हूं?] (Http://stackoverflow.com/questions/748062/how-can-i-return-multiple-values-from-a-function-in -c) – nawfal

उत्तर

6

सी # एकाधिक रिटर्न मानों का समर्थन नहीं करता है इसलिए इस मामले में आपको DateTime संरचना वापस करनी चाहिए जो मूर्खतापूर्ण दृष्टिकोण है। क्लाइंट कोड उन गुणों को अनदेखा कर सकता है जिनकी उन्हें परवाह नहीं है। आप अपनी खुद की सरल संरचना बना सकते हैं लेकिन यह वास्तव में प्रयास के लायक नहीं है।

+0

मेरी यह करने के लिए बहुत पहले सोचा था कि एक नई पद्धति, GetMinute कि बहुत ज्यादा GetHour कैसा दिखेगा बुलाया बनाने के लिए था ... लेकिन आदमी है कि एक आसान बात के लिए कोड का एक बहुत कुछ होगा। मैं अभी तक structs के बारे में एक श्वेत नहीं जानता। धन्यवाद! – DonG

+2

@ डॉनजी - 'डेटटाइम' का उपयोग करने का सबसे बड़ा लाभ स्पष्टता है। लगभग हर .NET डेवलपर को पता चलेगा कि आपके कोड का उपयोग कैसे करें। – ChaosPandion

1

हाँ, आप केवल सी # में विधि से एक 'चीज़' वापस कर सकते हैं।

आपके पास दूसरी समस्या यह है कि आप बिना किसी पैरामीटर के एक विधि को बुला रहे हैं। ब्रैकेट में चीजें:

public int GetHour (int hr, int min) // here 
{ 
} 

पैरामीटर हैं। और तुम तो की तरह, जब विधि बुला उन्हें निर्दिष्ट करना होगा:

mc.GetHour(1, 2); 

लेकिन निश्चित रूप से, अपने मामले में, यह समझ में यह करने के लिए नहीं है।

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

आशा है कि यह सहायक होगा।

1

क्षमा करें, आप ऐसा नहीं कर सकते। आप एक सरणी या ऑब्जेक्ट को लौटने में बेहतर सेवा करेंगे। आप डेटटाइम ऑब्जेक्ट वापस कर सकते हैं और इसका इस्तेमाल कर सकते हैं।

जैसा कि कहा गया है, आपके फ़ंक्शन हस्ताक्षर को ठीक से नहीं कहा जा रहा था।

class MyClass 
     { 
     public int[] GetHour() 
      { 
      DateTime dt = DateTime.Now; 

      int hour = dt.Hour; 
      int minute = dt.Minute; 

      return new int[]{hour, minute}; 
      } 
     } 

static void Main (string[] args) 
      { 
      MyClass mc = new MyClass(); 
int[] temp = mc.GetHour(); 
      Console.WriteLine ("Hour: {0} \n Minute: {1}", temp[0], temp[1]); 

      Console.ReadLine(); 
      } 
+0

ओह, मुझे पता है कि मैं बहुत सारी अनुचित चीजें कर रहा हूं! :-) धन्यवाद! – DonG

3

सी # उस फैशन में किसी विधि से सीधे कई मानों को वापस करने के विचार का समर्थन नहीं करता है। हालांकि कई विधियों को बनाने के तरीकों को बनाने के कुछ तरीके हैं। सबसे पहले ref/out पैरामीटर का उपयोग करना है।

public void GetHourMinute(out int hour, out int minute) { 
    var now = DateTime.Now; 
    hour = now.Hour; 
    minute = now.Minute; 
} 

दूसरा एक आवरण प्रकार है जो दो मानों समाहित तैयार करना है। 4.0 में शुरू करने से इसे Tuple प्रकार का उपयोग करके थोड़ा आसान बनाया जा सकता है।

public Tuple<int,int> GetHourMinute() { 
    var now = DateTime.Now; 
    return Tuple.Create(now.Hour, now.Minute); 
} 
+1

प्रथम श्रेणी के बिना समर्थन समर्थन मैं आम तौर पर ऐसी चीजें निजी रखता हूं। – ChaosPandion

+0

ठीक है, मैं जला दूंगा, मेरा मतलब है कि जब मैं इसे प्राप्त करता हूं तो उस पुल को पार करें। यह मूल्यों को वापस करने में मेरी अपनी छोटी खोज थी। धन्यवाद! – DonG

+0

@DonG, 'out' मापदंडों का उपयोग करने का सुझाव के बारे में, मैं तुम्हें http://stackoverflow.com/questions/2366741/what-is-bad-practice-when-using-out-parameters – DaveDev

2

1: आपके पास दो return एस नहीं हो सकते हैं।एक बार जब संकलक return कथन तक पहुंच जाता है, तो विधि का संचालन समाप्त हो जाता है।
2: यदि आप उनका उपयोग नहीं करते हैं तो आप पैरामीटर प्राप्त करने के लिए अपनी विधि क्यों चाहेंगे? DateTime.Now आपको वर्तमान समय देता है, यदि आप स्वयं को उस विधि के रूप में सोचेंगे - आपको अपना कार्य पूरा करने के लिए क्या चाहिए? कुछ भी नहीं।

तो, व्यावहारिक सुझाव:
1. दरअसल, दिनांक समय आपको अपनी विधि से बेहतर की आवश्यकता होती है।

Console.WriteLine ("Hour: {0} \n Minute: {1}", DateTime.Now.Hour,DateTime.Now.Minute); 

बेहतर होता,
लेकिन उस पर ध्यान न दें और यह कक्षाओं में एक अभ्यास पर विचार करें।

2 दो मान लौटाना एक विधि की अवधारणा के खिलाफ है - एक विधि एक चीज लौटाती है (outref के रूप में अपवाद हैं, लेकिन हम उन्हें अनदेखा करेंगे)।
आप वास्तव में अपने कोड में देख सकते हैं - आपका विधि नाम GetHourGetHourAndMinutes नहीं है। मुझे नहीं लगता कि मैंने कभी "और" शब्द के साथ एक विधि का नाम देखा है - एक विधि केवल एक चीज है।

2

मेरा सुझाव है कि आप डेटटाइम ऑब्जेक्ट को वापस कर दें। फिर अपनी मुख्य विधि में आप घंटे और मिनट गुणों को कॉल करते हैं।

1

आप एकाधिक मान वापस नहीं कर सकते हैं। टाइमस्पैन वही है जो आप खोज रहे हैं। उस पर एक ऑब्जेक्ट बनाएं, जिसमें घंटे, मिनट और दूसरा भी शामिल है जिसे आप कैप्चर करना चाहते हैं और उसे वापस करना चाहते हैं।

इसके बारे में सोचने के लिए आओ, आपको ऊपर की आवश्यकता के लिए, आपको ऊपर की विधि भी लिखनी पड़ेगी। बस अपने कोड का उपयोग सीधे अपने कोड

+0

हाँ, यह डीईएफ़ एक बेहतर विचार सिर्फ TimeOfDay उपयोग करने के लिए है, लेकिन मेरे प्रयोग यहाँ एक से अधिक मान लौटने के साथ चारों ओर खेलने के लिए गया था। मैं सी # कक्षा के सप्ताह 3 में हूं ... धन्यवाद! – DonG

29

जैसा कि @ChosPandion द्वारा उल्लिखित है, उस विशिष्ट मामले में आप DateTime संरचना वापस कर देंगे।

सामान्य में, हालांकि, आप निम्नलिखित विकल्पों होगा:

out मापदंडों

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

public void GetTime(out int hr, out int min) 
{ 
    DateTime dt = DateTime.Now; 
    hr = dt.Hour; 
    min = dt.Minute; 
} 

static void Main(string[] args) 
{ 
    // declare variables for out parameters first 
    int hour, minute; 
    GetTime(out hour, out minute); 
} 

एक सरणी

यह एक सरल विधि है कि अच्छी तरह से काम करता है, तो मान वापस करने एक ही प्रकार है का उपयोग करना।

public int[] GetTime() 
{ 
    DateTime dt = DateTime.Now; 
    return new[] { dt.Hour, dt.Minute}; 
} 

एक संपत्ति बैग का उपयोग

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

class A 
{ 
    int Prop1 { get; set; } 
    int Prop2 { get; set; } 
} 

public A SomeMethod() 
{ 
    return new A() { Prop1 = 1, Prop2 = 2 } 
}  

एक टपल

का प्रयोग सी # 4.0 (VS 2010 की आवश्यकता है) में आप Tuple<T1, T2, ...> वर्ग का उपयोग कर सकते हैं:

public Tuple<int, int> GetTime() 
{ 
    DateTime dt = DateTime.Now; 
    return Tuple.Create(dt.Hour, dt.Minute); 
} 

सी # 7.0 tuples

सी # 7.0 कहते हैं एकाधिक वापसी मूल्यों के लिए समर्थन। इस तरह एक परोक्ष बनाया टपल वापस जाने के लिए आप कोड लिख सकते हैं:

(string, string, string) LookupName(long id) // tuple return type 
{ 
    ... // retrieve first, middle and last from data storage 
    return (first, middle, last); // tuple literal 
} 

टपल तत्वों नाम Item1, Item2, आदि डिफ़ॉल्ट रूप से कर रहे हैं, लेकिन आप यह भी नाम, उदाहरण के लिए निर्दिष्ट कर सकते हैं

(string first, string middle, string last) LookupName(long id) // tuple return type 
{ 
    ... // retrieve first, middle and last from data storage 
    return (first, middle, last); // tuple literal 
} 

और फिर उन नामों के माध्यम से टपल तत्वों का उपयोग:

var names = LookupName(id); 
WriteLine($"found {names.first} {names.last}."); 
+0

मुझे थोड़ा सा गड़बड़ होने के लिए पैरामीटर मिलते हैं लेकिन यह निश्चित रूप से एक व्यवहार्य समाधान है। – ChaosPandion

+1

@ChaosPandion: हाँ, वहाँ निश्चित रूप से अक्सर बेहतर दृष्टिकोण, मैं सिर्फ संभावनाओं का अवलोकन प्रदान करने के लिए कोशिश कर रहा हूँ। –

+0

कृपया वर्तनी को ठीक करें: ट्यूपल टुपल होना चाहिए। – mtreit

1

आप दो बार वापस नहीं लौट सकते, केवल एक बार।
कई वापसी मूल्यों को एक बार में लैम्ब्डा अभिव्यक्तियों की आवश्यकता होती है, और AFAIK, केवल पायथन उसमें सक्षम है।
सिंटेक्स वहाँ इस प्रकार है:

return x, y 

तो हो सकता है आप IronPython की कोशिश करनी चाहिए, और फिर सी # करने के लिए विघटित।

सी # में, एक से अधिक मान वापस करने के बिल्कुल दो तरीके हैं:
1. संदर्भ द्वारा कॉल के रूप में तर्कों का उपयोग करें, इस तरह आप 3 चर निर्दिष्ट कर सकते हैं और फिर वापस आ सकते हैं।
2. किसी प्रकार की संरचना/कक्षा/सरणी/ट्यूपल/वेक्टर का उपयोग करें और इसमें अपने कई मान रखें।

कॉल संदर्भ द्वारा कुछ इस तरह है:

public static void xxx (संदर्भ var1, रेफरी var2, रेफरी var3) { var1 = 123; var2 = 456; var3 = 789; वापसी; }

तो आप कार्य करें:

int a =1; 
int b=2; 
int c=3; 

xxx(ref a, ref b, ref c); 

Console.WriteLine(a.ToString()); 
Console.WriteLine(b.ToString()); 
Console.WriteLine(c.ToString()); 
1

सी # में एक विधि कई बार लौट सकते हैं, यदि आप yield return प्रारूप का उपयोग करें।

using System.Collections.Generic; 

namespace YieldReturn 
{ 
    class Program 
    { 
     public static void Main(string[] args) 
     { 
      MyClass mc = new MyClass(); 
      IEnumerator<int> enu = mc.GetHour().GetEnumerator(); 
      enu.MoveNext(); 
      int hour = enu.Current; 
      enu.MoveNext(); 
      int min = enu.Current; 
      Console.WriteLine("Hour {0} min {1}", hour, min); 
      Console.ReadKey(true); 
     } 
    } 

    class MyClass 
    { 
     DateTime dt; 

     public MyClass() 
     { 
      dt = DateTime.Now; 
     } 
     public IEnumerable<int> GetHour() 
     { 
      int hour = dt.Hour; 
      int minute = dt.Minute; 
      yield return hour; 
      yield return minute; 
     } 
    } 
} 

देता है "घंटे 8 मिनट 50"

0

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

तो संक्षिप्त के लिए। क्यूं कर? एक ऑब्जेक्ट में अपने रिटर्न वैल्यू को एनक्यूलेट करें?एक समारोह में कई चीजें मत करो।

संपादित करें: आपके मामले में मैं भी एक समारोह में अपने कार्यक्षमता लपेट नहीं होगा सिर्फ लिखने:

static void Main (string[] args) 
     { 
     MyClass mc = new MyClass(); 
     DateTime now = DateTime.Now; 
     int hour = now.Hour; 
     int min = now.Minute; 
     Console.WriteLine ("Hour: {0} \n Minute: {1}", hour, min); 

     Console.ReadLine(); 
     } 

और अपने कार्य नाम GetHour ऐसा नहीं करता समारोह क्या कहते हैं ... अगर यह कहते हैं GetHour यह घंटे और नहीं घंटे से अधिक मिनट लौटना चाहिए।

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