什么是“返回” 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”语句,并且变得混乱。

这可能吗?退货有退货类型吗?这样做的正确方法是什么?


关于这一点,我什至不知道从if内部返回是否仅退出if语句就可以。我可能必须使用goto。无论如何,这都不重要
Arkyris

但是,您是要结束程序还是要结束新人的日常活动?
DCG

结束新人的日常活动。基本上只是上一级菜单。但是我不想在每次输入后都这样做。if(fname ==“ EXIT”){Console.Write(“您真的要离开此菜单吗?”); Console.ReadLine(); 返回; }
Arkyris

1
您可以throw exception在方法中以及return相应的方法中catch
Dmitry Bychenko

Answers:


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#也使用JavaScript使用的Java样式。
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)
{ }

2
有趣的是,我没有意识到自己创建例外。我将了解有关此的更多信息。
Arkyris

@CaiusJard完成了!感谢您的注意,这是一个好习惯。
dcg

@CaiusJard是的,这样会更好,我会编辑。谢谢
DCG

1
@Arkyris不一定非要自己例外;即使只是说出throw new Exception()并抓住它,该技术也能很好地工作。框架中还存在一个OperationCanceledException,其名称可能与您要尝试执行的操作很相称,并且可能有意义。通常,我们抛出不同的Exception类型,因此我们可以区分是否捕获某些异常,但是本质上,子方法使外部方法返回的唯一方法是让子方法抛出,外部方法不捕获然后控制返回外部/上方的方法“返回收益”
Caius Jard

1
@dgg 除非确实需要,否则不要将异常用于流控制也不要创建异常类。另一方面,我看到的更糟。我正在维护一个由高级开发人员控制的程序流,该程序流具有以错误消息区分的字符串类型异常。
StackOverthrow

1

Return语句用于从具有返回类型的方法中返回值。当编写一个以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;
}

您可以在Main中使用此方法

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

他们仍然需要花时间输入所有内容,不是吗?
Arkyris

如果他们在任何时候键入exit,它将停止。返回方法,立即离开方法CreatePerson
Jawad

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;
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.