[c#] Double.TryParse 또는 Convert.ToDouble-어느 것이 더 빠르고 안전합니까?

내 응용 프로그램은 VSTO를 사용하여 Excel 파일을 읽고 읽은 데이터를 StringDictionary. 숫자가 몇 개인 데이터 만 추가합니다 (1000 1000,2 1000,34-쉼표는 러시아 표준에서 구분 기호입니다).

현재 문자열이 적절한 숫자인지 확인하는 것이 더 낫습니까?

object data, string key; // data had read

try
{
  Convert.ToDouble(regionData, CultureInfo.CurrentCulture);
  dic.Add(key, regionData.ToString());
}
catch (InvalidCastException)
{
  // is not a number
}

또는

double d;
string str = data.ToString();
if (Double.TryParse(str, out d)) // if done, then is a number
{
  dic.Add(key, str);
}

다음 구문 분석 알고리즘 문제 때문에 StringDictionary대신 사용해야 Dictionary<string, double>합니다.

내 질문 : 어느 쪽이 더 빠릅니까? 어느 것이 더 안전합니까?

Convert.ToDouble(object)또는 전화하는 것이 더 낫 Convert.ToDouble(string)습니까?



답변

릴리스 모드에서 빠른 비 과학적 테스트를 수행했습니다. 두 가지 입력을 사용했습니다 : “2.34523”과 “badinput”을 두 메서드에 모두 1,000,000 번 반복했습니다.

유효한 입력 :

Double.TryParse = 646ms
Convert.ToDouble = 662 ms

예상대로 크게 다르지 않습니다. 모든 의도와 목적을 위해 유효한 입력을 위해 이들은 동일합니다.

잘못된 입력:

Double.TryParse = 612ms
Convert.ToDouble = ..

음 .. 오랜만에 달렸어요. 1,000 번의 반복을 사용하여 전체를 다시 실행했고 Convert.ToDouble잘못된 입력으로 8.3 초가 걸렸습니다. 평균을 내면 2 시간 이상 걸립니다. 유효하지 않은 입력의 경우 테스트가 얼마나 기본적인지 신경 쓰지 않습니다.Convert.ToDouble ‘예외 발생으로 인해 성능이 저하됩니다.

그래서, TryParse그것을 뒷받침 할 몇 가지 숫자를 가진 또 다른 투표가 있습니다.


답변

우선, 나는 애초에 사용하는 double.Parse것이 아니라 사용 Convert.ToDouble합니다.

Parse또는 사용 여부에 관해서 TryParse: 잘못된 입력 데이터가 있으면 계속 진행할 수 있습니까? 아니면 정말 예외적 인 조건입니까? 예외적이라면 사용 Parse하고 입력이 나쁘면 날려 버리십시오. 예상하고 깔끔하게 처리 할 수있는 경우 TryParse.


답변

.NET Framework 디자인 지침에서는 Try 메서드 사용을 권장합니다. 예외를 피하는 것은 일반적으로 좋은 생각입니다.

Convert.ToDouble(object) 할 것이다 ((IConvertible) object).ToDouble(null);

전화 할 것 Convert.ToDouble(string, null)

따라서 문자열 버전을 호출하는 것이 더 빠릅니다.

그러나 문자열 버전은 다음을 수행합니다.

if (value == null)
{
    return 0.0;
}
return double.Parse(value, NumberStyles.Float | NumberStyles.AllowThousands, provider);

따라서 double.Parse직접 수행하는 것이 더 빠릅니다 .


답변

예외를 처리하지 않으려면 TryParse를 사용하십시오. TryParse는 전체 예외 스택 추적을 처리 할 필요가 없기 때문에 더 빠릅니다.


답변

나는 일반적으로 Convert클래스 를 피하려고합니다 (의미 : 사용하지 않습니다). 왜냐하면 매우 혼란 스럽기 때문입니다. 코드는 여기서 정확히 무슨 일이 일어나는지에 대한 힌트를 너무 적게 제공합니다.Convert 동일한 코드에서 의미 상 매우 다른 변환이 많이 발생할 수 . 이것은 프로그래머가 정확히 무슨 일이 일어나고 있는지 제어하기 어렵게 만듭니다.

그러므로 나의 충고는 절대이 수업을 사용하지 말라는 것입니다. 실제로 필요하지도 않습니다 (숫자의 이진 형식화는 예외 ToString입니다. 숫자 클래스 의 일반적인 방법은이를 수행하는 적절한 방법을 제공하지 않기 때문입니다 ).


답변

입력을 100 % 확신하지 않는 한 Double.TryParse를 사용해야합니다.

Convert.ToDouble will throw an exception on non-numbers
Double.Parse will throw an exception on non-numbers or null
Double.TryParse will return false or 0 on any of the above without generating an exception.

예외보다 훨씬 느리지 않기 때문에 예외를 던질 때 구문 분석 속도가 부차적입니다.


답변

여기에 Convert 클래스에 대한 많은 증오가 있습니다. 약간의 균형을 맞추기 위해 Convert에 대한 한 가지 이점이 있습니다.

Convert.ToDouble(o);

o가 이미 Double (또는 int 또는 쉽게 캐스팅 할 수있는 모든 것)이면 값을 쉽게 반환 할 수 있습니다.

Double.Parse 또는 Double.TryParse를 사용하는 것은 이미 문자열에있는 경우 유용하지만

Double.Parse(o.ToString());

가야 문자열이 제 더 비싼이 될 수 귀하의 의견에 따라 구문 분석 할 수 있습니다.