Какой тип возврата «возврат» 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» после каждого ввода, и он получит беспорядок.

Это возможно? У возврата есть тип возврата? Каков был бы правильный способ сделать это?

Arkyris
источник
На этой ноте я даже не знаю, будет ли возвращение изнутри if if просто выйти из оператора if. Я мог бы использовать goto. В любом случае это не
главное
Но вы хотите закончить программу или прекратить превращать нового человека в рутину?
DCG
Конец создания нового человека рутиной. В основном просто зайдите в меню уровня lvl. Но я не хочу делать это после каждой записи. if (fname == "EXIT") {Console.Write ("Вы действительно хотите покинуть это меню?"); Console.ReadLine (); возвращение; }
Arkyris
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
Это не более читабельно.
user253751
Это похоже на Javascript, а не на C #.
ouflak
@outflak Microsoft C # использует стиль Allman, но Mono C # также использует стиль Java, используемый JavaScript.
aloisdg переходит на codidact.com
2
@ user253751 Вы не могли быть более неправильным. Код в этом ответе намного проще, чем код OP, по той причине, что ответчик правильно объяснил. И я решительно выступаю за удобочитаемость и ремонтопригодность в качестве первой заботы после правильности.
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)
{ }
DCG
источник
2
Интересно, что я не знал о создании собственных исключений. Я узнаю больше об этом, спасибо.
Аркирис
@CaiusJard сделано! Спасибо, что заметили, это хорошая практика.
DCG
@CaiusJard да, было бы лучше, я буду редактировать. Спасибо
dcg
1
@Arkyris это не обязательно должно быть вашим собственным исключением; эта техника будет хорошо работать, даже просто говоря throw new Exception()и ловя ее. В платформе также есть исключение OperationCanceledException, имя которого, возможно, соответствует тому, что вы пытаетесь сделать, и может иметь смысл использовать. Обычно мы генерируем разные типы исключений, чтобы можно было различать при перехвате некоторых, а не других, но по сути единственный способ для метода sub сделать возврат внешнего метода - это бросить метод sub, внешний метод not catch, а затем возврат элемента управления к методу выше внешнего / "возврат"
Caius Jard
1
@dgg Не используйте исключения для управления потоком и не создавайте классы исключений, если это действительно не нужно . С другой стороны, я видел еще хуже; Я поддерживаю код, в котором предположительно старший разработчик контролировал поток программ со строго типизированными исключениями, отличающимися их сообщениями об ошибках.
StackOverthrow
1

Операторы возврата используются для возврата значения из метода, который имеет тип возврата. Когда вы пишете метод с void в качестве возвращаемого типа, вы можете использовать метод return;для выхода из метода.

например, следующий метод использует строку в качестве возвращаемого типа,

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

Если вы пишете метод, который создает объект и возвращает его вызывающему методу, то тип возвращаемого значения будет Person (если вы не собираетесь делать что-то еще). Если вы проверите пользовательский ввод и решите не создавать Персона, вы можете использовать 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;
    }
Джонел Зейп
источник