「return」の戻り型は何ですか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

回答:


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が

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もあり、その名前はおそらくあなたがしようとしていることに適合しており、使用する意味がありそうです。通常、異なる例外タイプをスローするため、いくつかをキャッチして他のタイプを区別することはできませんが、サブメソッドが外部メソッドを返す唯一の方法は、サブメソッドがスローし、外部がキャッチせずにリターンを制御することです上記のメソッドに戻る/「リターンリターン」
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と入力すると停止します。returnは、メソッドを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;
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.