구문 분석 대 TryParse


111

Parse ()와 TryParse ()의 차이점은 무엇입니까?

int number = int.Parse(textBoxNumber.Text);

// The Try-Parse Method
int.TryParse(textBoxNumber.Text, out number);

Try-Catch 블록과 같은 어떤 형태의 오류 검사가 있습니까?

답변:


155

Parse값을 구문 분석 할 수없는 경우 예외를 throw하고 성공 여부를 나타내는를 TryParse반환합니다 bool.

TryParse단지 try/ catch내부적으로 가 아닙니다. 요점은 예외없이 구현되어 빠르다는 것입니다. 실제로 이것이 구현 될 가능성이 가장 높은 Parse방법은 메서드가 내부적으로 호출 TryParse한 다음을 반환하면 예외를 throw하는 것 false입니다.

요컨대, Parse값이 유효하다고 확신하는 경우 사용 하십시오. 그렇지 않으면 TryParse.


1
"내부적으로 Parse 메서드는 TryParse를 호출합니다."단, Parse는 여러 버전에 의해 TryParse보다 이전 날짜입니다. 물론 핵심 구현을 TryParse로 옮겼을 수도 있습니다 ...
Joel Coehoorn

4
@Joel-나는 그들이 구현을 옮겼을 것이라고 생각했지만, 방금 리플렉터를 살펴 보았고 하나는 'throw ...'가 있고 하나는 'return false'가있는 것 외에는 정확히 동일한 코드를 가진 별도의 구현입니다 . 왜 통합되지 않는지 궁금합니다!
Greg Beech

6
생각해 보면 Parse는 여러 가지 예외를 던지므로 TryParse의 bool 만 있으면 어떤 예외를 던질 지 알 수 없습니다.
Greg Beech

5
"값이 유효하다고 확신하는 경우 Parse를 사용하십시오". "하지만 당신이 틀렸을 가능성은 인정합니다"라고 덧붙이고 싶습니다. 파싱 ​​할 수 있다고 100 % 확신했다면 더 빠를 수있는 TryParse를 올바르게 사용할 수 있습니다.
Jon

2
그리고 "다른 예외"에 의해 @GregBeech는 클래스가 아니라 메시지를 의미합니다.
Paul Draper 2013

26

문자열을 정수로 변환 할 수없는 경우

  • int.Parse() 예외가 발생합니다
  • int.TryParse() false를 반환합니다 (예외를 던지지 않음).

int.TryParse (some_method_that_throws_exception (), out int test)를 사용하면 어떻게됩니까? 예외가 발생합니까 아니면 구문 분석과 관련된 예외 만 포착합니까?
Alexandru Antochi 2018

@AlexandruAntochi 코멘트로 질문해서는 안됩니다. 이것은 다른 사람들이 유용한 답변으로부터 혜택을받는 것을 거의 불가능하게 만들 것입니다. 그러나 귀하의 질문에 대한 대답은 no, int.TryParse는 전혀 던지지 않습니다. 메서드가 구문 분석에 실패하면 false 반환 값으로 만이를 반영합니다. 이렇게하면 if (int.TryParse… 구문 분석이 성공한 경우에만 작업을 수행하는 것이 편리합니다.
Rob

3

TryParse 메서드를 사용하면 구문 분석 가능한 항목이 있는지 테스트 할 수 있습니다. 잘못된 int를 사용하여 첫 번째 인스턴스 에서처럼 Parse를 시도하면 TryParse에서 예외가 발생하고 구문 분석의 성공 여부를 알려주는 부울을 반환합니다.

각주로서 대부분의 TryParse 메서드에 null을 전달하면 예외가 발생합니다.


기본 유형 (INT, 더블, 날짜 시간 등)에 null을 전달하면 예외가 던져되지 않습니다
박사 Yunke

3

TryParse 및 예외 세금

Parse는 문자열에서 지정된 데이터 유형으로의 변환이 실패하는 경우 예외를 throw하는 반면 TryParse는 예외 발생을 명시 적으로 방지합니다.


대부분의 필수 TryParse 메서드에 대해 null을 전달하면 TryParse에서 예외가 발생합니다.
Ray Booysen

1
훌륭한 링크. 아직 아무도 "어떤 것이 가장 좋거나 어떤 코딩 방법을 적용해야하는지"논의를 시작하지 않은 것에 놀랐습니다.
Christian Madsen

0

TryParse는 값을 반환하지 않고 구문 분석이 성공했는지 여부를 나타내는 상태 코드를 반환합니다 (예외를 throw하지 않음).


6
TryParse는 out 키워드로 지정된 매개 변수 2를 통해 값을 반환합니다.
Christian Madsen

0

기록을 위해 두 가지 코드를 테스트하고 있습니다. 단순히 문자열에서 숫자로 변환을 시도하고 실패하면 숫자를 0에 할당합니다.

        if (!Int32.TryParse(txt,out tmpint)) {
            tmpint = 0;
        }

과:

        try {
            tmpint = Convert.ToInt32(txt);
        } catch (Exception) {
            tmpint = 0;
        }

C #의 경우 가장 좋은 옵션은 try & Catch 대안이 예외를 throw했기 때문에 tryparse를 사용하는 것입니다.

A first chance exception of type 'System.FormatException' occurred in mscorlib.dll

고통스럽고 느리고 바람직하지 않지만 Debug의 예외가 중지되지 않는 한 코드는 중지되지 않습니다.


첫 번째 코드 스 니핏은 아무 작업도 수행하지 않습니다. 문자열을 int로 구문 분석 할 수없는 경우 tmpint가 이미 0으로 설정되어 있기 때문입니다.
Andrew Neely

0

나는 그것의 매우 오래된 게시물을 알고 있지만 Parse 대 TryParse에 대한 몇 가지 세부 사항을 공유하려고 생각했습니다.

DateTime을 String으로 변환해야하는 시나리오가 있었고 datevalue null 또는 string.empty 인 경우 예외가 발생했습니다. 이를 극복하기 위해 Parse를 TryParse로 대체했으며 기본 날짜를 가져옵니다.

이전 코드 :

dTest[i].StartDate = DateTime.Parse(StartDate).ToString("MM/dd/yyyy");
dTest[i].EndDate = DateTime.Parse(EndDate).ToString("MM/dd/yyyy");

새 코드 :

DateTime startDate = default(DateTime);
DateTime endDate=default(DateTime);
DateTime.TryParse(dPolicyPaidHistories[i].StartDate, out startDate);
DateTime.TryParse(dPolicyPaidHistories[i].EndDate, out endDate);

다른 변수를 선언하고 TryParse를 위해 Out으로 사용해야합니다.


당신은 초기화 할 필요가 없습니다 startDateendDate같은 DateTime.TryParse항상 그들을 덮어 쓰게됩니다 DateTime.MinValue. 잘못된 날짜 표현을 다른 값으로 변환해야하는 경우 반환 값을 확인하고 DateTime.TryParsefalse이면 값을 명시 적으로 설정합니다.
Palec

사용 DateTime?( 날짜 시간 null 허용 )
Kiquenet

-1

double.Parse ( "-"); 예외를 발생시키는 동안 double.TryParse ( "-", out parsed); 0으로 구문 분석하므로 TryParse가 더 복잡한 변환을 수행한다고 생각합니다.


4
하지만 TryParse반환 true또는 false? 이것이 "유효"한지 알 수있는 방법입니다.
Paul Draper
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.