Quel est le type de retour de «retour» C # [fermé]

9

Je fais une application console et j'ai un "Menu" où l'utilisateur peut entrer des informations pour créer un nouvel objet Personne. Ce qui suit est à l'intérieur d'une méthode.

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

ainsi. Je veux que l'utilisateur puisse quitter la méthode à tout moment s'il décide qu'il ne veut pas faire une nouvelle personne. Je voudrais donc faire une nouvelle méthode appelée "CheckExit" et s'ils tapent "EXIT", il quittera la méthode "CreatePerson". Je veux donc que le "CheckExit" renvoie un retour. Sinon, je dois ajouter une instruction "if" après chaque entrée et cela devient encombrant-y.

Est-ce possible? Le retour a-t-il un type de retour? Quelle serait la bonne façon de procéder?

Arkyris
la source
Sur cette note, je ne sais même pas si un retour de l'intérieur d'un if fonctionnerait ou quitterait simplement l'instruction if. Je devrais peut-être utiliser un goto. Quoi qu'il en soit, c'est d'ailleurs le point
Arkyris
Mais vous voulez mettre fin au programme ou mettre fin à la routine de la nouvelle personne?
dcg
Finissez de faire une nouvelle routine de personne. Fondamentalement, il suffit de monter un menu lvl. Mais je ne veux pas avoir à le faire après chaque entrée. if (fname == "EXIT") {Console.Write ("Voulez-vous vraiment quitter ce menu?"); Console.ReadLine (); revenir; }
Arkyris
1
Vous pouvez throw exceptiondans la méthode et returndans le correspondantcatch
Dmitry Bychenko

Réponses:

8

returnn'est pas un type que vous pouvez renvoyer, c'est un mot-clé pour renvoyer un résultat. Malheureusement, ce que vous essayez de faire n'est pas possible. Cependant, vous pouvez rendre votre code beaucoup plus lisible et extensible en utilisant un tableau de requêtes et en obtenant les résultats pour chacun à l'intérieur d'une boucle. Cela a pour effet supplémentaire de pouvoir ajouter facilement plus de requêtes.

// 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
la source
7
Ce n'est pas plus lisible.
user253751
Cela ressemble à Javascript, pas à C #.
ouflak
@outflak Microsoft C # utilise le style Allman, mais Mono C # utilise également le style Java utilisé par JavaScript.
aloisdg passe à codidact.com le
2
@ user253751 Vous ne pourriez pas vous tromper davantage. Le code de cette réponse est beaucoup plus simple que le code de l'OP, pour la raison que le répondeur a correctement expliqué. Et je suis un ardent défenseur de la lisibilité et de la maintenabilité comme première préoccupation après l'exactitude.
StackOverthrow
2
@ user253751 Une métrique extrêmement douteuse qui est tombée hors d'usage il y a des décennies, et pour une bonne raison.
StackOverthrow
7

Vous pouvez créer une méthode pour lire à partir de la console pour automatiser ce processus, quelque chose comme

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

Votre code ressemblerait alors à:

try {
    string fName = ReadFromConsole("Please enter the first name: ");
    ....
}
catch (StopCreatingPersonException)
{ }
dcg
la source
2
Intéressant, je n'étais pas au courant de créer mes propres exceptions. Je vais en savoir plus sur ce merci.
Arkyris
@CaiusJard fait! Merci de noter, c'est une bonne pratique.
dcg
@CaiusJard oui, ce serait mieux, je vais éditer. Merci
dcg
1
@Arkyris, ce n'est pas nécessairement votre propre exception; cette technique fonctionnerait bien même juste en disant throw new Exception()et en l'attrapant. Il y a aussi une OperationCanceledException dans le framework dont le nom correspond peut-être à ce que vous essayez de faire et pourrait avoir un sens à utiliser. En règle générale, nous lançons différents types d'exception afin de pouvoir différencier les interceptions de certains et pas d'autres, mais en substance, le seul moyen pour une sous-méthode de renvoyer une méthode externe consiste à renvoyer la sous-méthode, l'extérieur à ne pas intercepter puis à contrôler les retours. à la méthode au-dessus de l'extérieur / un "retour retour"
Caius Jard
1
@dgg N'utilisez pas d'exceptions pour le contrôle de flux et ne créez pas de classes d'exceptions sauf si c'est vraiment nécessaire . D'un autre côté, j'ai vu encore pire; Je maintiens le code où un programme censé être contrôlé par un développeur senior avec des exceptions typées en chaîne se distinguant par leurs messages d'erreur.
StackOverthrow
1

Les instructions de retour sont utilisées pour renvoyer une valeur à partir d'une méthode qui a un type de retour. Lorsque vous écrivez une méthode avec void comme type de retour, vous pouvez utiliser la return;pour quitter la méthode.

par exemple, la méthode suivante utilise une chaîne comme type de retour,

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

Si vous écrivez une méthode qui crée l'objet et le renvoie à la méthode appelante, le type de retour serait la personne (sauf si vous avez l'intention de faire autre chose). Si vous vérifiez l'entrée utilisateur et décidez de ne pas créer de personne, vous pouvez utiliser 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;
}

Et vous pouvez utiliser cette méthode dans le Main,

public static void Main(string[] args) 
{
    Person person = CreatePerson();
    if (person == null) {
       Console.WriteLine("User Exited.");
    }
    else
    {
       // Do Something with person.
    }
}
Jawad
la source
Ils devraient encore prendre le temps de tout entrer, non?
Arkyris
s'ils saisissent exit à tout moment, cela s'arrêterait. retourner les moyens, quitter la méthode, CreatePersontout de suite.
Jawad
0

La seule façon est d'utiliser returnsi vous souhaitez terminer la méthode. Mais vous pouvez raccourcir votre code quelque chose comme ça:

    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
la source