Apa jenis pengembalian "kembali" C # [ditutup]

9

Saya membuat aplikasi konsol dan saya memiliki "Menu" di mana pengguna dapat memasukkan informasi untuk membuat objek Orang baru. Berikut ini di dalam metode.

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

seperti itu. Saya ingin pengguna dapat keluar dari metode kapan saja jika mereka memutuskan tidak ingin membuat orang baru. Jadi saya ingin membuat metode baru yang disebut "CheckExit" dan jika mereka mengetik "EXIT" itu akan meninggalkan metode "CreatePerson". Jadi saya ingin "CheckExit" mengembalikan pengembalian. Kalau tidak, saya harus menambahkan pernyataan "jika" setelah setiap input dan yang mendapat kekacauan.

Apakah ini mungkin? Apakah return memiliki tipe return? Apa cara yang tepat untuk melakukan ini?

Arkyris
sumber
Pada catatan itu saya bahkan tidak tahu apakah pengembalian dari dalam jika akan bekerja hanya keluar dari pernyataan if. Saya mungkin harus menggunakan goto. Pokoknya itu selain intinya
Arkyris
Tetapi Anda ingin mengakhiri program atau mengakhiri rutinitas orang baru?
dcg
Akhiri membuat orang baru menjadi rutin. Pada dasarnya hanya naik menu lvl. Tapi saya tidak mau harus melakukan ini setelah setiap entri. if (fname == "EXIT") {Console.Write ("Apakah Anda benar-benar ingin meninggalkan menu ini?"); Console.ReadLine (); kembali; }
Arkyris
1
Anda bisa throw exceptiondalam metode dan returnyang sesuaicatch
Dmitry Bychenko

Jawaban:

8

returnbukan jenis yang dapat Anda kembalikan, ini adalah kata kunci untuk mengembalikan hasil. Jadi sayangnya apa yang Anda coba lakukan tidak mungkin. Namun, Anda dapat membuat kode Anda jauh lebih mudah dibaca dan diperluas dengan menggunakan array kueri dan mendapatkan hasil untuk setiap bagian dalam loop. Ini memiliki efek bonus untuk dapat menambahkan lebih banyak permintaan dengan mudah.

// 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
sumber
7
Ini tidak lebih mudah dibaca.
user253751
Ini terlihat seperti Javascript, bukan C #.
ouflak
@outflak Microsoft C # menggunakan gaya Allman, tetapi Mono C # juga menggunakan gaya Java yang digunakan oleh JavaScript.
aloisdg pindah ke codidact.com
2
@ user253751 Anda tidak bisa salah lagi. Kode dalam jawaban ini jauh lebih sederhana daripada kode OP, untuk alasan yang dijawab penjawab dengan benar. Dan saya pendukung kuat keterbacaan dan pemeliharaan sebagai perhatian pertama setelah kebenaran.
StackOverthrow
2
@ user253751 Metrik yang sangat meragukan yang tidak digunakan lagi beberapa dekade yang lalu, dan karena alasan yang baik.
StackOverthrow
7

Anda dapat membuat metode untuk membaca dari konsol untuk mengotomatiskan proses ini, seperti

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

Maka kode Anda akan terlihat seperti:

try {
    string fName = ReadFromConsole("Please enter the first name: ");
    ....
}
catch (StopCreatingPersonException)
{ }
dcg
sumber
2
Menarik, saya tidak sadar menciptakan pengecualian saya sendiri. Saya akan belajar lebih banyak tentang ini, terima kasih.
Arkyris
@CaiusJard selesai! Terima kasih telah mencatat, ini latihan yang bagus.
dcg
@CaiusJard ya, akan lebih baik, saya akan mengedit. Terima kasih
dcg
1
@Arkyris tidak secara khusus harus menjadi pengecualian Anda sendiri; teknik ini akan bekerja dengan baik bahkan hanya dengan mengatakan throw new Exception()dan menangkapnya. Ada juga OperationCanceledException dalam kerangka yang namanya mungkin cocok dengan apa yang Anda coba lakukan dan bisa masuk akal untuk digunakan. Biasanya kita membuang berbagai jenis Pengecualian sehingga kita dapat membedakan dalam menangkap beberapa dan bukan yang lain, tetapi pada dasarnya satu-satunya cara bagi sub metode untuk membuat metode luar kembali adalah dengan metode sub untuk melempar, luar untuk tidak menangkap dan kemudian mengontrol pengembalian ke metode di atas bagian luar / "pengembalian kembali"
Caius Jard
1
@ dgg Jangan gunakan pengecualian untuk kontrol aliran dan jangan membuat kelas pengecualian kecuali itu benar-benar diperlukan . Di sisi lain, saya pernah melihat yang lebih buruk; Saya menjaga kode tempat aliran program yang seharusnya dikontrol pengembang senior dengan pengecualian yang diketik dengan benar dibedakan oleh pesan kesalahan mereka.
StackOverthrow
1

Pernyataan pengembalian digunakan untuk mengembalikan nilai dari metode yang memiliki tipe pengembalian. Saat Anda menulis metode dengan void sebagai tipe pengembalian, Anda bisa menggunakan return;untuk keluar dari metode.

mis., metode berikut menggunakan string sebagai tipe pengembalian,

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

Jika Anda menulis metode yang membuat objek dan mengembalikannya ke metode pemanggilan, maka tipe pengembalian adalah Person (kecuali jika Anda bermaksud melakukan sesuatu yang lain). Jika Anda memeriksa input pengguna dan memutuskan untuk tidak membuat Orang, Anda dapat menggunakannya 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;
}

Dan Anda dapat menggunakan metode ini di Main,

public static void Main(string[] args) 
{
    Person person = CreatePerson();
    if (person == null) {
       Console.WriteLine("User Exited.");
    }
    else
    {
       // Do Something with person.
    }
}
Jawad
sumber
Mereka masih harus meluangkan waktu untuk memasuki segalanya, bukan?
Arkyris
jika mereka mengetikkan keluar kapan saja, itu akan berhenti. kembali berarti, tinggalkan metode, CreatePersonsegera.
Jawad
0

Satu-satunya cara adalah menggunakan returnjika Anda ingin menghentikan metode. Tetapi Anda dapat mempersingkat beberapa hal seperti ini:

    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
sumber