Qual è il tipo di ritorno di "return" C # [chiuso]


9

Sto creando un'applicazione console e ho un "Menu" in cui l'utente può inserire informazioni per creare un nuovo oggetto Person. Di seguito è riportato un metodo.

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

così. Voglio che l'utente sia in grado di uscire dal metodo in qualsiasi momento se decide di non voler creare una nuova persona. Quindi mi piacerebbe creare un nuovo metodo chiamato "CheckExit" e se digitano "EXIT" lascerà il metodo "CreatePerson". Quindi voglio che "CheckExit" restituisca un reso. Altrimenti devo aggiungere un'istruzione "if" dopo ogni input e questo diventa disordinato.

È possibile? Il ritorno ha un tipo di ritorno? Quale sarebbe il modo corretto per farlo?


Su quella nota non so nemmeno se un ritorno dall'interno di un if funzionerebbe semplicemente uscendo dall'istruzione if. Potrei dover usare un goto. Ad ogni modo questo è oltre il punto
Arkyris il

Ma vuoi terminare il programma o terminare la routine della nuova persona?
dcg

Finisci di creare una nuova persona di routine. Fondamentalmente basta andare su un menu Liv. Ma non voglio farlo dopo ogni entrata. if (fname == "EXIT") {Console.Write ("Vuoi davvero uscire da questo menu?"); Console.ReadLine (); ritorno; }
Arkyris il

1
È possibile throw exceptionnel metodo e returnnel corrispondentecatch
Dmitry Bychenko

Risposte:


8

returnnon è un tipo che puoi restituire, è una parola chiave per restituire un risultato. Quindi sfortunatamente ciò che stai cercando di fare non è possibile. Tuttavia, puoi rendere il tuo codice molto più leggibile ed estendibile utilizzando una matrice di query e ottenendo i risultati per ciascuno all'interno di un ciclo. Ciò ha l'effetto bonus di poter aggiungere facilmente altre query.

// 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
Questo non è più leggibile.
user253751

Questo sembra Javascript, non C #.
ouflak,

@outflak Microsoft C # utilizza lo stile Allman, ma Mono C # usa anche lo stile Java utilizzato da JavaScript.
aloisdg si trasferisce su codidact.com il

2
@ user253751 Non potresti essere più sbagliato. Il codice in questa risposta è molto più semplice del codice OP, per il motivo che il risponditore ha spiegato correttamente. E sono un forte sostenitore della leggibilità e della manutenibilità come prima preoccupazione dopo la correttezza.
StackOverthrow

2
@ user253751 Una metrica estremamente dubbia che è fallita da decenni e per buoni motivi.
StackOverthrow

7

È possibile creare un metodo per leggere dalla console per automatizzare questo processo, qualcosa del genere

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

Quindi il tuo codice sarebbe simile a:

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

2
Interessante non ero a conoscenza di creare le mie eccezioni. Imparerò di più su questo grazie.
Arkyris,

@CaiusJard fatto! Grazie per averlo notato, è una buona pratica.
dcg

@CaiusJard sì, sarebbe meglio, lo modificherò. Grazie
dcg

1
@Arkyris non deve essere specificamente la tua eccezione; questa tecnica funzionerebbe bene anche solo dicendo throw new Exception()e catturandola. C'è anche una OperationCanceledException nel framework il cui nome forse si adatta a quello che stai cercando di fare e potrebbe avere senso usare. Generalmente lanciamo diversi tipi di eccezione in modo da poter differenziare nel catturare alcuni e non altri, ma in sostanza l'unico modo per un metodo secondario di restituire un metodo esterno è quello di lanciare il metodo secondario, l'esterno di non catturare e quindi controllare i rendimenti al metodo sopra l'esterno / un "ritorno di ritorno"
Caius Jard

1
@dgg Non utilizzare le eccezioni per il controllo del flusso e non creare classi di eccezione a meno che non sia veramente necessario . D'altra parte, ho visto anche peggio; Sto mantenendo il codice in cui un programma presumibilmente senior ha controllato il flusso del programma con eccezioni tipizzate in modo rigoroso, distinte dai loro messaggi di errore.
StackOverthrow

1

Le dichiarazioni di restituzione vengono utilizzate per restituire un valore da un metodo che ha un tipo di restituzione. Quando si scrive un metodo con vuoto come tipo restituito, è possibile utilizzare il return;per uscire dal metodo.

ad esempio, il seguente metodo utilizza una stringa come tipo restituito,

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

Se stai scrivendo un metodo che crea l'oggetto e lo restituisce al metodo chiamante, il tipo restituito sarebbe la Persona (a meno che tu non intenda fare qualcos'altro). Se si controlla l'input dell'utente e si decide di non creare una persona, è possibile utilizzare 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;
}

E puoi usare questo metodo in Principale,

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

Dovrebbero ancora prendersi il tempo per entrare in tutto, no?
Arkyris,

se digitano exit in qualsiasi momento, si fermerebbe. ritorno significa, lasciare il metodo, CreatePersonsubito.
Jawad,

0

L'unico modo è utilizzare returnse si desidera terminare il metodo. Ma puoi abbreviare il tuo codice in questo modo:

    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;
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.