Kiểu trả về của quay trở lại là gì C # [đã đóng]


9

Tôi đang tạo một ứng dụng giao diện điều khiển và tôi có một "Menu" nơi người dùng có thể nhập thông tin để tạo một đối tượng Person mới. Sau đây là bên trong một phương pháp.

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

như vậy Tôi muốn người dùng có thể thoát khỏi phương thức bất cứ lúc nào nếu họ quyết định họ không muốn làm người mới. Vì vậy, tôi muốn tạo một phương thức mới gọi là "CheckExit" và nếu họ gõ "EXIT", nó sẽ rời khỏi phương thức "CreatPerson". Vì vậy, tôi muốn "CheckExit" trả lại tiền. Mặt khác, tôi phải thêm một câu lệnh "if" sau mỗi đầu vào và nó sẽ bị lộn xộn.

Điều này có thể không? Liệu trả lại có một loại trả lại? Điều gì sẽ là cách thích hợp để làm điều này?


Trên lưu ý đó, tôi thậm chí không biết nếu một sự trở lại từ bên trong một if sẽ hoạt động nếu chỉ thoát khỏi câu lệnh if. Tôi có thể phải sử dụng một goto. Dù sao đó cũng là điểm chính
Arkyris

Nhưng bạn muốn kết thúc chương trình hay kết thúc việc biến người mới thành thói quen?
dcg

Kết thúc làm cho một người mới thường xuyên. Về cơ bản chỉ cần đi lên một menu lvl. Nhưng tôi không muốn phải làm điều này sau mỗi lần nhập cảnh. if (fname == "EXIT") {Console.Write ("Bạn có thực sự muốn rời khỏi menu này không?"); Bảng điều khiển.ReadLine (); trở về; }
Arkyris

1
Bạn có thể throw exceptiontheo phương thức và returntương ứngcatch
Dmitry Bychenko

Câu trả lời:


8

returnkhông phải là loại mà bạn có thể trả về, đó là một từ khóa để trả về kết quả. Thật không may, những gì bạn đang cố gắng làm là không thể. Tuy nhiên, bạn có thể làm cho mã của mình dễ đọc hơn và có thể mở rộng hơn bằng cách sử dụng một mảng các truy vấn và nhận kết quả cho mỗi bên trong một vòng lặp. Điều này có hiệu ứng tiền thưởng để có thể thêm nhiều truy vấn dễ dàng.

// 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
Điều này không dễ đọc hơn.
dùng253751

Điều này trông giống như Javascript, không phải C #.
ngerak

@outflak Microsoft C # sử dụng kiểu Allman, nhưng Mono C # cũng sử dụng kiểu Java được sử dụng bởi JavaScript.
aloisdg chuyển đến codidact.com

2
@ user253751 Bạn không thể sai nhiều hơn. Các mã trong câu trả lời này là nhiều đơn giản hơn mã của OP, vì lý do người trả lời giải thích một cách chính xác. Và tôi là một người ủng hộ mạnh mẽ khả năng đọc và duy trì là mối quan tâm đầu tiên sau khi đúng.
StackOverthrow

2
@ user253751 Một số liệu cực kỳ đáng ngờ đã bị sử dụng từ nhiều thập kỷ trước và vì lý do chính đáng.
StackOverthrow

7

Bạn có thể tạo một phương thức để đọc từ bảng điều khiển để tự động hóa quá trình này, đại loại như

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

Sau đó, mã của bạn sẽ trông như sau:

try {
    string fName = ReadFromConsole("Please enter the first name: ");
    ....
}
catch (StopCreatingPersonException)
{ }

2
Thú vị là tôi đã không biết tạo ra ngoại lệ của riêng mình. Tôi sẽ tìm hiểu thêm về điều này cảm ơn bạn.
Arkyris

@CaiusJard xong! Cảm ơn bạn đã lưu ý, đó là một thực hành tốt.
dcg

@CaiusJard vâng, nó sẽ tốt hơn, tôi sẽ chỉnh sửa. Cảm ơn
dcg

1
@Arkyris nó không nhất thiết phải là ngoại lệ của riêng bạn; kỹ thuật này sẽ hoạt động tốt ngay cả khi chỉ cần nói throw new Exception()và bắt nó. Ngoài ra còn có một Activity HủyedException trong khung có tên có lẽ phù hợp với những gì bạn đang cố gắng thực hiện và có thể có ý nghĩa để sử dụng. Thông thường chúng ta ném các loại Exception khác nhau để chúng ta có thể phân biệt bắt một số và không phải loại khác, nhưng về bản chất, cách duy nhất để phương thức phụ thực hiện trả về phương thức bên ngoài là phương thức phụ để ném, bên ngoài không bắt và sau đó kiểm soát trả về theo phương pháp bên ngoài / "trả lại tiền"
Caius Jard

1
@dgg Đừng sử dụng ngoại lệ để kiểm soát luồngkhông tạo các lớp ngoại lệ trừ khi thực sự cần thiết . Mặt khác, tôi còn thấy tệ hơn nữa; Tôi đang duy trì mã nơi một nhà phát triển được cho là nhà phát triển cao cấp kiểm soát luồng chương trình với các ngoại lệ được gõ nghiêm ngặt được phân biệt bởi các thông báo lỗi của họ.
StackOverthrow

1

Các câu lệnh return được sử dụng để trả về một giá trị từ một phương thức có kiểu trả về. Khi bạn viết một phương thức với void là kiểu trả về, bạn có thể sử dụng return;để thoát phương thức.

ví dụ: phương thức sau sử dụng một chuỗi làm kiểu trả về,

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

Nếu bạn đang viết một phương thức tạo đối tượng và trả nó về phương thức gọi, thì kiểu trả về sẽ là Người (trừ khi bạn có ý định làm gì đó khác). Nếu bạn kiểm tra đầu vào của người dùng và quyết định không tạo Người, bạn có thể sử dụng 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;
}

Và bạn có thể sử dụng phương pháp này trong Chính,

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

Họ vẫn sẽ phải dành thời gian để vào mọi thứ, phải không?
Arkyris

nếu họ gõ thoát bất cứ lúc nào, nó sẽ dừng lại. trả lại phương tiện, rời khỏi phương thức, CreatePersonngay lập tức.
Jawad

0

Cách duy nhất là sử dụng returnnếu bạn muốn chấm dứt phương thức. Nhưng bạn có thể rút ngắn mã của mình một số thứ như thế này:

    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;
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.