ประเภทผลตอบแทนของ“ ผลตอบแทน” คือ C # [ปิด]


9

ฉันกำลังสร้างแอปพลิเคชันคอนโซลและฉันมี "เมนู" ซึ่งผู้ใช้สามารถป้อนข้อมูลเพื่อสร้างวัตถุบุคคลใหม่ ต่อไปนี้เป็นวิธีการภายใน

        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" เพื่อส่งคืนสินค้า มิฉะนั้นฉันจะต้องเพิ่มคำสั่ง "ถ้า" หลังจากทุกอินพุตและที่ได้รับความยุ่งเหยิง -y

เป็นไปได้ไหม การคืนสินค้ามีประเภทการคืนสินค้าหรือไม่? อะไรจะเป็นวิธีที่เหมาะสมในการทำเช่นนี้?


ในบันทึกนั้นฉันไม่รู้ด้วยซ้ำว่าการกลับมาจากข้างในและถ้าจะทำงานก็แค่ออกจากคำสั่ง 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 # ยังใช้สไตล์ Java ที่ JavaScript ใช้
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
@ อาร์คีริสไม่จำเป็นต้องเป็นข้อยกเว้นของคุณโดยเฉพาะ เทคนิคนี้จะทำงานได้ดีแม้เพียงแค่พูดthrow new Exception()และจับมัน นอกจากนี้ยังมี OperationCanceledException ในกรอบซึ่งอาจมีชื่อที่เหมาะกับสิ่งที่คุณกำลังพยายามทำและสามารถใช้งานได้ โดยทั่วไปแล้วเราจะทำการยกเว้นประเภทที่แตกต่างกันเพื่อให้เราสามารถแยกความแตกต่างในการจับบางและไม่ใช่คนอื่น ๆ แต่ในสาระสำคัญวิธีเดียวสำหรับวิธีการย่อยที่จะทำให้วิธีการส่งกลับด้านนอกเป็นวิธีการย่อยที่จะโยนด้านนอกจะไม่จับแล้วควบคุมผลตอบแทน วิธีข้างต้น / a "กลับมาคืน"
Caius Jard

1
@dgg ไม่ได้ใช้ข้อยกเว้นสำหรับการควบคุมการไหลและไม่ได้สร้างการเรียนยกเว้นเว้นแต่เป็นกรณีที่มีความจำเป็นจริงๆ ในทางกลับกันฉันก็เห็นยิ่งแย่ลงไปอีก ฉันกำลังบำรุงรักษาโค้ดโดยที่นักพัฒนาซอฟต์แวร์อาวุโสที่ควบคุมการไหลของโปรแกรมพร้อมข้อยกเว้นที่พิมพ์อย่างเข้มงวดโดดเด่นด้วยข้อความแสดงข้อผิดพลาด
StackOverthrow

1

คำสั่ง Return ใช้เพื่อส่งคืนค่าจากเมธอดที่มีชนิด return เมื่อคุณเขียนวิธีด้วยโมฆะเป็นชนิดส่งคืนคุณสามารถใช้return;เพื่อออกจากวิธี

เช่นวิธีการต่อไปนี้ใช้สตริงเป็นชนิดส่งคืน

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

หากคุณกำลังเขียนวิธีการที่สร้างวัตถุและส่งกลับไปยังวิธีการโทรแล้วประเภทส่งคืนจะเป็นบุคคล (เว้นแต่คุณตั้งใจจะทำอย่างอื่น) 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;
}

และคุณสามารถใช้วิธีนี้ในหน้าหลัก

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

พวกเขายังคงต้องใช้เวลาในการเข้าสู่ทุกสิ่งใช่ไหม?
Arkyris

หากพวกเขาพิมพ์ออกเมื่อใดก็จะหยุด กลับหมายถึงออกจากวิธีการได้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;
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.