내 응용 프로그램은 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());
가야 할 문자열이 제 더 비싼이 될 수 귀하의 의견에 따라 구문 분석 할 수 있습니다.