Який тип повернення “повернення” C # [закрито]


9

Я роблю консольний додаток і маю "Меню", куди користувач може вводити інформацію для створення нового об'єкта Person. Далі всередині методу.

        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
Дмитро Биченко

Відповіді:


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
Це не читабельніше.
користувач253751

Це схоже на Javascript, а не на C #.
ouflak

@outflak Microsoft C # використовує стиль Allman, але Mono C # також використовує стиль Java, що використовується JavaScript.
aloisdg переходить на codidact.com

2
@ user253751 Ви не можете помилитися більше Код у цій відповіді набагато простіше, ніж код ОП, з тієї причини, що відповідач правильно пояснив. І я щирий прихильник читабельності та ремонтопридатності, як перше занепокоєння після коректності.
StackOverthrow

2
@ user253751 Надзвичайно сумнівна метрика, яка вийшла з ужитку десятиліття тому, і з поважної причини.
StackOverthrow

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
@Arkyris це не обов'язково повинно бути вашим власним винятком; ця методика спрацювала б навіть просто, кажучи throw new Exception()і ловити її. Також є рамка OperationCanceledException, назва якої, можливо, відповідає тому, що ви намагаєтесь зробити, і могло б мати сенс використовувати. Зазвичай ми викидаємо різні типи винятків, щоб ми могли диференціюватись у відловленні одних, а не інших, але, по суті, єдиний спосіб для підводного методу зробити зовнішній метод повернення - це підкинути метод методу, зовнішній - не схопити, а потім керувати поверненнями до методу над зовнішнім / "поверненням повернення"
Кайус Джард

1
@dgg Не використовуйте винятки для контролю потоку і не створюйте класи винятків, якщо це дійсно не потрібно . З іншого боку, я бачив ще гірше; Я підтримую код, де нібито старший розробник керує потоком програми із строго типізованими винятками, що відрізняються їх повідомленнями про помилки.
StackOverthrow

1

Повернення операторів використовуються для повернення значення методу, який має тип повернення. Коли ви пишете метод з void як тип повернення, ви можете використовувати 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;
}

І ви можете використовувати цей метод в Main,

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.