"반품"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 문을 끝내는 것인지 알지 못합니다. 고토를 사용해야 할 수도 있습니다. 그 시점 외에는
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

이것은 C #이 아닌 Javascript처럼 보입니다.
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도 있습니다. 이름은 아마도 당신이하려는 일에 적합하고 사용하기에 합리적입니다. 일반적으로 우리는 다른 예외 유형을 던져서 다른 것을 잡는 것을 구별 할 수는 없지만, 서브 메소드가 외부 메소드를 리턴하도록 만드는 유일한 방법은 서브 메소드가 던지고 외부 메소드가 던지지 않고 제어 리턴을 제어하는 ​​유일한 방법입니다 외부 / "반환 반환"위의 방법에
Caius Jard

1
@dgg 마십시오 흐름 제어에 대한 예외를 사용하지 하고 정말 필요한 않는 한 예외 클래스를 작성하지 않습니다 . 반면에, 나는 훨씬 더 나 빠졌다. 오류 메시지로 구별되는 문자열 형식의 예외가있는 수석 개발자 제어 프로그램 흐름으로 코드를 유지하고 있습니다.
StackOverthrow

1

리턴 문은 리턴 유형이있는 메소드에서 값을 리턴하는 데 사용됩니다. 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;
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.