Was ist der Rückgabetyp von "return" C # [geschlossen]

9

Ich erstelle eine Konsolenanwendung und habe ein "Menü", in das der Benutzer Informationen eingeben kann, um ein neues Personenobjekt zu erstellen. Das Folgende ist in einer Methode enthalten.

        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();

wie so. Ich möchte, dass der Benutzer die Methode jederzeit beenden kann, wenn er entscheidet, dass er keine neue Person erstellen möchte. Daher möchte ich eine neue Methode namens "CheckExit" erstellen. Wenn sie "EXIT" eingeben, bleibt die Methode "CreatePerson" übrig. Ich möchte also, dass der "CheckExit" eine Rückgabe zurückgibt. Andernfalls muss ich nach jeder Eingabe eine "if" -Anweisung hinzufügen, und das wird unübersichtlich.

Ist das möglich? Hat return einen Rückgabetyp? Was wäre der richtige Weg, dies zu tun?

Arkyris
quelle
In diesem Sinne weiß ich nicht einmal, ob eine Rückkehr aus einem if heraus funktionieren würde, wenn nur die if-Anweisung beendet würde. Ich muss vielleicht ein goto benutzen. Auf jeden Fall geht es nicht
darum
Aber Sie möchten das Programm beenden oder die Routine für neue Personen beenden?
dcg
Beenden Sie die Routine einer neuen Person. Grundsätzlich gehen Sie einfach ein Menü lvl. Aber ich möchte das nicht nach jedem Eintrag tun müssen. if (fname == "EXIT") {Console.Write ("Möchten Sie dieses Menü wirklich verlassen?"); Console.ReadLine (); Rückkehr; }
Arkyris
1
Sie können throw exceptionin der Methode und returnin der entsprechendencatch
Dmitry Bychenko

Antworten:

8

returnist kein Typ, den Sie zurückgeben können, sondern ein Schlüsselwort für die Rückgabe eines Ergebnisses. Leider ist das, was Sie versuchen, nicht möglich. Sie können Ihren Code jedoch viel lesbarer und erweiterbarer machen, indem Sie eine Reihe von Abfragen verwenden und die Ergebnisse für jede innerhalb einer Schleife abrufen. Dies hat den Bonuseffekt, dass problemlos weitere Abfragen hinzugefügt werden können.

// 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 ...
J. Schultke
quelle
7
Dies ist nicht besser lesbar.
user253751
Dies sieht aus wie Javascript, nicht wie C #.
Ouflak
@outflak Microsoft C # verwendet den Allman-Stil, Mono C # verwendet jedoch auch den von JavaScript verwendeten Java-Stil.
Aloisdg wechselt zu codidact.com
2
@ user253751 Sie könnten nicht falscher sein. Der Code in dieser Antwort ist viel einfacher als der Code des OP, aus dem Grund, den der Antwortende richtig erklärt hat. Und ich bin ein starker Befürworter der Lesbarkeit und Wartbarkeit als erstes Anliegen nach der Korrektheit.
StackOverthrow
2
@ user253751 Eine äußerst zweifelhafte Metrik , die vor Jahrzehnten aus gutem Grund nicht mehr verwendet wurde.
StackOverthrow
7

Sie können eine Methode zum Lesen von der Konsole erstellen, um diesen Prozess zu automatisieren

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;
}

Dann würde Ihr Code folgendermaßen aussehen:

try {
    string fName = ReadFromConsole("Please enter the first name: ");
    ....
}
catch (StopCreatingPersonException)
{ }
dcg
quelle
2
Interessanterweise wusste ich nicht, dass ich meine eigenen Ausnahmen schaffen würde. Ich werde mehr darüber erfahren, danke.
Arkyris
@CaiusJard fertig! Vielen Dank für die Bemerkung, es ist eine gute Praxis.
dcg
@CaiusJard ja, es wäre besser, ich werde bearbeiten. Danke
dcg
1
@Arkyris es muss nicht speziell deine eigene Ausnahme sein; Diese Technik würde gut funktionieren, selbst wenn man sie nur sagt throw new Exception()und fängt. Es gibt auch eine OperationCanceledException im Framework, deren Name möglicherweise zu dem passt, was Sie versuchen, und dessen Verwendung sinnvoll sein könnte. Normalerweise werfen wir verschiedene Ausnahmetypen aus, damit wir unterscheiden können, ob einige und nicht andere abgefangen werden. Im Wesentlichen besteht die einzige Möglichkeit für eine Untermethode, eine äußere Methode zurückzugeben, darin, dass die Untermethode wirft, die äußere Methode keine Rückgaben abfängt und dann steuert zu der Methode über dem äußeren / a "return return"
Caius Jard
1
@dgg Verwenden Sie keine Ausnahmen für die Flusskontrolle und erstellen Sie keine Ausnahmeklassen, es sei denn, dies ist wirklich erforderlich . Auf der anderen Seite habe ich noch schlimmer gesehen; Ich verwalte Code, in dem ein angeblich leitender Entwickler den Programmfluss mit streng typisierten Ausnahmen steuert, die sich durch ihre Fehlermeldungen auszeichnen.
StackOverthrow
1

Rückgabeanweisungen werden verwendet, um einen Wert von einer Methode mit einem Rückgabetyp zurückzugeben. Wenn Sie eine Methode mit void als Rückgabetyp schreiben, können Sie die Methode mit beenden return;.

Beispiel: Die folgende Methode verwendet eine Zeichenfolge als Rückgabetyp.

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

Wenn Sie eine Methode schreiben, die das Objekt erstellt und an die aufrufende Methode zurückgibt, ist der Rückgabetyp die Person (sofern Sie nicht beabsichtigen, etwas anderes zu tun). Wenn Sie die Benutzereingaben überprüfen und entscheiden, keine Person zu erstellen, können Sie verwenden 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;
}

Und Sie können diese Methode im Main verwenden,

public static void Main(string[] args) 
{
    Person person = CreatePerson();
    if (person == null) {
       Console.WriteLine("User Exited.");
    }
    else
    {
       // Do Something with person.
    }
}
Jawad
quelle
Sie müssten sich immer noch die Zeit nehmen, um alles zu betreten, nicht wahr?
Arkyris
Wenn sie zu irgendeinem Zeitpunkt den Exit eingeben, wird er gestoppt. Rückgabe bedeutet, die Methode CreatePersonsofort verlassen.
Jawad
0

Die einzige Möglichkeit ist die Verwendung, returnwenn Sie die Methode beenden möchten. Sie können Ihren Code jedoch folgendermaßen kürzen:

    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;
    }
Jonel Zape
quelle