Quick Reference
Parse는 text가 contract를 만족하지 않으면 exception을, TryParse는 false와 default output을 돌려줍니다. user input·optional field처럼 failure가 예상되면 TryParse, invalid data가 프로그램 오류여야 하면 Parse 또는 exact parse를 고릅니다.
int value = int.Parse("42");
if (int.TryParse(input, out int parsed))
{
Process(parsed);
}
bool valid = int.TryParse(input, out _);TryParse가false면 output value를 정상 parsed result로 쓰지 않습니다.- protocol/file data는
NumberStyles와CultureInfo.InvariantCulture를 명시합니다. - 사람이 입력하는 local format은 해당 user culture와 validation message를 함께 설계합니다.
- fixed wire format 날짜·시간은
TryParseExact/ParseExact를 우선합니다.
성공과 실패 contract
static int ReadPort(string text)
{
int port = int.Parse(text, CultureInfo.InvariantCulture);
return port is > 0 and <= 65_535
? port
: throw new ArgumentOutOfRangeException(nameof(text));
}
static bool TryReadPort(string text, out int port)
{
if (!int.TryParse(text, NumberStyles.None, CultureInfo.InvariantCulture, out port))
{
return false;
}
return port is > 0 and <= 65_535;
}Parse failure는 input에 따라 FormatException, OverflowException, null argument 관련 exception처럼 failure를 exception으로 보냅니다. TryParse는 format/range failure를 false로 나타내며 output에는 해당 type의 default value가 들어갈 수 있습니다. false 뒤에 output을 0이나 default라는 유효한 값으로 오해하지 않습니다.
Try...가 false를 반환하는지와 domain validation이 성공했는지는 다릅니다. 숫자로 parse한 뒤 port range, age, permission 같은 application rule을 별도로 검사합니다.
형식과 culture
bool parsed = decimal.TryParse(
"1,234.50",
NumberStyles.Number,
CultureInfo.InvariantCulture,
out decimal amount);
bool dateParsed = DateOnly.TryParseExact(
"2026-08-10",
"yyyy-MM-dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateOnly date);IFormatProvider를 생략하면 many Parse API는 current culture를 사용합니다. UI input에 local convention을 허용할지, machine-to-machine data에 fixed invariant format을 요구할지 먼저 정합니다. NumberStyles를 너무 넓게 주면 원래 금지해야 할 currency sign·whitespace·exponent를 받아들일 수 있으므로 input contract에 맞는 최소 style을 고릅니다.
GUID, enum, date/time, numeric type마다 제공하는 parse overload와 case·format 규칙이 다릅니다. external schema가 있다면 type의 가장 permissive TryParse에 맡기지 말고 exact format 또는 schema validation을 둡니다.
Span과 API 선택
ReadOnlySpan<char> digits = "score=1234".AsSpan(6);
bool parsed = int.TryParse(digits, out int score);span overload는 existing text 일부를 Substring()으로 새 string으로 만들지 않고 parse할 수 있습니다. 이득은 large text나 hot path에서 allocation measurement로 확인하고, 일반 UI input에 복잡한 span slicing을 먼저 도입하지 않습니다.
| 입력 성격 | 선택 | 실패 처리 |
|---|---|---|
| user form·query parameter | TryParse | validation error |
| code가 만든 invariant config | Parse 또는 TryParse 후 configuration error | fail fast policy |
| fixed protocol date/number | TryParseExact/ParseExact | schema failure |
| text slice hot path | span overload | same success/failure contract |
자주 틀리는 부분
CultureInfo.InvariantCulture가 모든 user-facing parsing의 정답은 아닙니다. 안정된 interchange format에는 적합하지만, 사용자가 1,5처럼 지역 관례로 입력하는 UI에는 explicit user culture와 안내가 필요합니다.
TryParse가 false인 상태에서 output을 계속 쓰면 0, false, default date처럼 정상 값과 구분되지 않는 버그가 생깁니다. success branch 안에서만 결과를 사용하거나 Result type으로 묶으세요.
참고 링크
3 sources