"वापसी" C # [बंद] का वापसी प्रकार क्या है


9

मैं एक कंसोल एप्लिकेशन बना रहा हूं और मेरे पास एक "मेनू" है जहां उपयोगकर्ता एक नया व्यक्ति ऑब्जेक्ट बनाने के लिए जानकारी दर्ज कर सकता है। निम्नलिखित एक विधि के अंदर है।

        Write("Please enter the first name: ", false);
        string fName = Console.ReadLine().ToUpper();
        Write("Please enter the middle initial: ", false);
        string mInitial = Console.ReadLine().ToUpper();
        Write("Please enter the last name: ", false);
        string lName = Console.ReadLine().ToUpper();

इस तरह। मैं चाहता हूं कि उपयोगकर्ता किसी भी समय विधि से बाहर निकलने में सक्षम हों यदि वे तय करते हैं कि वे एक नया व्यक्ति नहीं बनाना चाहते हैं। इसलिए मैं "CheckExit" नामक एक नई विधि बनाना चाहता हूं और यदि वे "EXIT" टाइप करते हैं तो यह "CreatePerson" विधि छोड़ देगा। इसलिए मैं चाहता हूं कि "CheckExit" एक रिटर्न लौटाए। अन्यथा मुझे हर इनपुट के बाद एक "if" स्टेटमेंट जोड़ना होगा और वह क्लटर-वाई हो जाएगा।

क्या यह संभव है? क्या रिटर्न में रिटर्न टाइप होता है? ऐसा करने का उचित तरीका क्या होगा?


उस नोट पर मुझे यह भी नहीं पता कि अगर एक बयान के अंदर से एक वापसी सिर्फ अगर बयान से बाहर निकलने का काम करेगा। मुझे गोटो का इस्तेमाल करना पड़ सकता है। या तो इस बिंदु के अलावा
आर्कियोसिस

लेकिन आप कार्यक्रम को समाप्त करना चाहते हैं या नए व्यक्ति को दिनचर्या बनाना चाहते हैं?
dcg

एक नए व्यक्ति को दिनचर्या बनाना। मूल रूप से बस एक मेनू lvl ऊपर जाना है। लेकिन मैं हर प्रविष्टि के बाद ऐसा नहीं करना चाहता। if (fname == "EXIT") {Console.Write ("क्या आप वास्तव में इसे छोड़ना चाहते हैं?"); Console.ReadLine (); वापसी; }
अर्किरिस

1
आप throw exceptionविधि returnमें और इसी में कर सकते हैंcatch
दिमित्री Bychenko

जवाबों:


8

returnएक प्रकार नहीं है जिसे आप वापस कर सकते हैं, यह एक परिणाम के लिए एक कीवर्ड है। इसलिए दुर्भाग्य से आप जो करने की कोशिश कर रहे हैं वह संभव नहीं है। हालाँकि, आप अपने कोड को प्रश्नों की एक सरणी का उपयोग करके और लूप के प्रत्येक के लिए परिणाम प्राप्त करके अधिक पठनीय और विस्तार योग्य बना सकते हैं। यह अधिक प्रभाव को आसानी से जोड़ने में सक्षम होने का बोनस प्रभाव है।

// you can put these queries somewhere outside the function
string[] queries = {"Please enter the first name: ", ...}
var results = new List<string>();

foreach (string query in queries) {
    Write(query, false);
    var result = Console.ReadLine().ToUpper();
    if (result.Equals("EXIT") {
        return;
    }
    results.Add(result);
}

// handle your inputs from the results list here ...

7
यह अधिक पठनीय नहीं है।
user253751

यह जावास्क्रिप्ट की तरह दिखता है, न कि C #।
उलफाक

@outflak Microsoft C # ऑलमैन शैली का उपयोग करता है, लेकिन मोनो सी # जावा द्वारा प्रयुक्त जावा शैली का भी उपयोग करता है।
aloisdg

2
@ user253751 आप अधिक गलत नहीं हो सकते। इस उत्तर में कोड ओपी के कोड की तुलना में बहुत सरल है, कारण के लिए उत्तरदाता ने सही ढंग से समझाया। और मैं शुद्धता के बाद पहली चिंता के रूप में पठनीयता और स्थिरता की मजबूत पैरोकार हूं।
स्टैकऑवरथ्रो

2
@ user253751 एक बेहद संदिग्ध मीट्रिक जो दशकों पहले उपयोग से बाहर हो गया, और अच्छे कारण के लिए।
स्टैकऑवरथ्रो

7

आप इस प्रक्रिया को स्वचालित करने के लिए कंसोल से पढ़ने की विधि बना सकते हैं, कुछ इस तरह से

internal class StopCreatingPersonException : Exception
{}

public static string ReadFromConsole(string prompt)
{
     Write(prompt, false);
     var v = Console.ReadLine().ToUpper();
     if (v == "EXIT") { throw new StopCreatingPerson (); }
     return v;
}

तब आपका कोड ऐसा दिखेगा:

try {
    string fName = ReadFromConsole("Please enter the first name: ");
    ....
}
catch (StopCreatingPersonException)
{ }

2
दिलचस्प है कि मैं अपना खुद का अपवाद बनाने से अनजान था। मैं इस धन्यवाद के बारे में अधिक जानूंगा।
अर्काइरिस

@CaiusJard किया! ध्यान देने के लिए धन्यवाद, यह एक अच्छा अभ्यास है।
dcg

@CaiusJard हाँ, यह बेहतर होगा, मैं संपादित करूँगा। धन्यवाद
Dcg

1
@ अर्काइरिस के लिए विशेष रूप से आपका खुद का अपवाद होना जरूरी नहीं है; यह तकनीक सिर्फ कहने throw new Exception()और पकड़ने से भी अच्छा काम करेगी । फ्रेमवर्क में एक OperationCanceledException भी है जिसका नाम शायद आप क्या करने की कोशिश कर रहे हैं और उपयोग करने के लिए समझ में आता है फिट बैठता है। आमतौर पर हम अलग-अलग अपवाद प्रकार फेंकते हैं, इसलिए हम कुछ को पकड़ने में अंतर कर सकते हैं, दूसरों को नहीं, लेकिन संक्षेप में एक उप विधि के लिए एक बाहरी विधि वापसी बनाने का एकमात्र तरीका उप विधि फेंकने के लिए है, बाहरी को पकड़ने के लिए नहीं है और फिर रिटर्न को नियंत्रित करने के लिए बाहरी / "रिटर्न रिटर्न" के ऊपर की विधि
कैयस जार्ड

1
@ डग प्रवाह नियंत्रण के अपवादों का उपयोग न करें और जब तक यह वास्तव में आवश्यक न हो, अपवाद कक्षाएं न बनाएं । दूसरी ओर, मैंने और भी बुरा देखा है; मैं कोड को बनाए रख रहा हूँ जहाँ एक कथित रूप से वरिष्ठ डेवलपर नियंत्रित प्रोग्राम प्रवाह को कड़े टाइप के अपवादों के साथ उनके त्रुटि संदेशों से अलग किया जाता है।
स्टैकऑवरथ्रो

1

रिटर्न स्टेटमेंट्स का उपयोग उस मान से वापसी के लिए किया जाता है जिसमें रिटर्न टाइप होता है। जब आप रिटर्न प्रकार के रूप में शून्य के साथ एक विधि लिखते हैं, तो आप return;विधि से बाहर निकलने के लिए उपयोग कर सकते हैं ।

उदाहरण के लिए, निम्न विधि रिटर्न टाइप के रूप में एक स्ट्रिंग का उपयोग करती है,

public string ReturnString() { return "thisString"; }

यदि आप एक विधि लिख रहे हैं जो ऑब्जेक्ट बनाता है और इसे कॉलिंग विधि पर लौटाता है, तो रिटर्न प्रकार व्यक्ति होगा (जब तक आप कुछ और करने का इरादा नहीं करते)। यदि आप उपयोगकर्ता इनपुट की जांच करते हैं और एक व्यक्ति नहीं बनाने का निर्णय लेते हैं, तो आप उपयोग कर सकते हैं return null;

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Initial { get; set; }
}

public static Person CreatePerson()
{
    Person person = new Person();
    Console.Write("Please enter the first name: ", false);
    string fName = Console.ReadLine().ToUpper();
    if (string.IsNullOrEmpty(fName) || fName.ToLower().Equals("exit"))
        return null;
    person.FirstName = fName;

    Console.Write("Please enter the middle initial: ", false);
    string mInitial = Console.ReadLine().ToUpper();
    if (string.IsNullOrEmpty(mInitial) || mInitial.ToLower().Equals("exit"))
        return null;
    person.Initial = mInitial;

    Console.Write("Please enter the last name: ", false);
    string lName = Console.ReadLine().ToUpper();
    if (string.IsNullOrEmpty(lName) || lName.ToLower().Equals("exit"))
        return null;
    person.LastName = lName;

    return person;
}

और आप इस विधि का उपयोग मेन में कर सकते हैं,

public static void Main(string[] args) 
{
    Person person = CreatePerson();
    if (person == null) {
       Console.WriteLine("User Exited.");
    }
    else
    {
       // Do Something with person.
    }
}

उन्हें अभी भी सब कुछ दर्ज करने के लिए समय निकालना होगा, नहीं?
अर्काइरिस

यदि वे किसी भी समय बाहर निकलते हैं, तो यह बंद हो जाएगा। वापसी का मतलब है, विधि छोड़ो, CreatePersonअभी।
जावद

0

returnयदि आप विधि को समाप्त करना चाहते हैं तो एकमात्र तरीका उपयोग करना है। लेकिन आप अपने कोड को कुछ इस तरह से छोटा कर सकते हैं:

    static void Main(string[] args)
    {
        createPerson();

        Console.WriteLine("Some display goes here...");
    }

    static void createPerson()
    {
        Console.WriteLine("Please enter the first name: ");
        string fName = getInput();
        if (isExit(fName))
        {
            return;
        }

        Console.WriteLine("Please enter the middle initial: ");
        string mInitial = getInput();
        if (isExit(mInitial))
        {
            return;
        }

        Console.WriteLine("Please enter the last name: ");
        string lName = getInput();
        if (isExit(lName))
        {
            return;
        }
    }

    static string getInput()
    {
        return Console.ReadLine().ToUpper();
    }

    static bool isExit(string value)
    {
        if (value == "EXIT")
        {
            Console.WriteLine("Create person has been canceled by the user.");
            return true;
        }
        return false;
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.