[C#] C # 메서드 이름에 “Try”는 언제 사용됩니까?

메소드 이름이 “Try”로 시작하는 경우의 의미에 대해 동료들과 논의했습니다.

다음과 같은 의견이있었습니다.

  • 메소드가 널값을 리턴 할 수있는 경우 “시도”를 사용하십시오.
  • 메소드가 예외를 발생시키지 않으면 “시도”를 사용하십시오.

공식적인 정의는 무엇입니까? 메소드 이름에 “시도”란 무엇입니까? 이것에 대한 공식적인 지침이 있습니까?



답변

이를 TryParse 패턴 이라고하며 Microsoft에서 문서화했습니다. 공식 예외 및 성능 MSDN 페이지는 말한다 :

예외와 관련된 성능 문제를 피하기 위해 일반적인 시나리오에서 예외를 발생시킬 수있는 멤버의 TryParse 패턴을 고려하십시오.

따라서 일반적인 유스 케이스에 예외가 발생할 수 있음을 의미하는 코드가있는 경우 (예 : 정수 구문 분석) TryParse 패턴이 의미가 있습니다.


답변

(수정 됨) Erik이 제안한 공식 지침이 있습니다.

TrySomething방법을 볼 때에

  • 던지지 않는다
  • 보고 bool
  • 값을 기대하면 ‘out’매개 변수를 통해 반환됩니다.
  • Something내가 예외를 직접 처리 할 수있는 방법 이 있습니다 . (Jesse Webb가 제안한 편집)

답변

try계속 진행하고 싶을 때 사용해야한다고 생각 합니다. 메소드가 값을 리턴하는지 여부는 중요하지 않습니다.

사례 1 : 문제가 없으면 어떻게 든 진행할 수 있습니다.

사례 2 : 반환되지 않으면 여전히 괜찮습니다. 다른 방법으로 진행할 수 있습니다.

그리고 해당 메소드의 출력으로 일부 값을 예상하면 out매개 변수 를 사용하십시오 .

int value
if (dictionary.TryGetValue("key", out value))
{
    // Proceed in some way
}
else
{
    // Proceed in some other way
}


답변

메소드 호출이 유효하지 않은 결과를 생성 할 수 있다는 사실을 나타내려면 메소드 이름에 “Try”를 사용해야합니다. .NET 표준에 따르면 예외를 발생시키는 함수가 아니라 일부 VALID또는NON_VALID 프로그램의 관점에서, 값입니다.

결국, 이것은 그룹에서 사용하기로 결정한 명명 규칙에 관한 것입니다.


답변

다음 try과 같은 경우 메소드 이름 에 포함하십시오 .

  • 당신은 예외를 던지지 않습니다
  • 귀하의 방법에는 다음과 같은 서명이 있습니다. bool TrySomething(input, out yourReturn)

따라서 기본적으로 try-methods 를 사용 하면 부울 결과 만 반환됩니다.

따라서 다음 코드는 예외를 발생시키지 않습니다.

string input = "blabla";
int number;
if (int.TryParse(input, out number))
{
// wooohooo we got an int!
} else
{
//dooh!
}

이 코드는 예외를 던질 수 있지만 (이 경우) 예외를 던질 수 있습니다.

string input = "blabla";
int number;
try
{
     number = int.Parse(input); //throws an exception
}
catch (Exception)
{
     //dooh!
}

Try 메서드를 사용하는 것이 더 안전하고 방어적인 코드 작성 방법입니다. 또한 코드 스 니펫 # 2는 정수가 아닌 경우 실행하는 데 더 많은 성능이 필요합니다.


답변

Bob 아저씨는 아래 그의 책 Clean Code 에서 예를 보여줍니다 . 예외가 발생할 것으로 예상 될 때마다 Try메소드 이름에 접두사를 사용할 수 있습니다 .

public void sendShutDown()
{
    try{
        tryToShutDown();
    } catch (DeviceShutDownError e) {
        logger.log(e);
    }
}

그리고 나서 (적응) :

private void tryToShutDown()
{
    //some code with no error handling, but
    //something might go wrong here
}

tryToShutDown메소드는 오류 처리를하지 않습니다 . 메소드의 책임이기 때문입니다 sendShutDown.

그만큼 TryParseMicrosoft 패턴은 출력 매개 변수를 피해야한다는 명확한 코드 지침을 위반합니다.

새 버전의 C #을 개발하지 않는 경우 모든 Microsoft 지침을 준수 할 필요는 없습니다. 때때로 그들은 최고가 아닙니다.


답변