C#
パターン3: Enum.TryParse + IsDefined — 2段ガードで数字文字列の罠も封じる
出典: C# TryParse の正解 — int.TryParse / DateTime.TryParse / Enum.TryParse で業務SE が踏む3つのハマり — 3パターンのコード比較 (動作確認つき) / パターン3: Enum.TryParse + IsDefined — 2段ガードで数字文字列の罠も封じる
public enum Status { Active = 1, Inactive = 2, Pending = 3 }
string[] inputs = { "Active", "active", "Pending", "Unknown", "0", "99", "" };
// NG パターン: Enum.TryParse 単独 (数字文字列が定義外でも true になる)
Console.WriteLine("--- Enum.TryParse 単独 (危険) ---");
foreach (var s in inputs) {
var ok = Enum.TryParse<Status>(s, ignoreCase: true, out var v);
Console.WriteLine($" '{s}' → ok={ok,-5} value={v} (定義値か: {Enum.IsDefined(typeof(Status), v)})");
}
// OK パターン: TryParse + IsDefined の2段ガード
Console.WriteLine("--- Enum.TryParse + IsDefined (2段ガード) ---");
static bool TryParseStrict<T>(string s, out T value) where T : struct, Enum
=> Enum.TryParse<T>(s, ignoreCase: true, out value) && Enum.IsDefined(typeof(T), value);
foreach (var s in inputs) {
if (TryParseStrict<Status>(s, out var v)) {
Console.WriteLine($" '{s}' → OK ({v})");
} else {
Console.WriteLine($" '{s}' → NG (定義外 or パース不可)");
}
}
▸ 実行ボタンで結果を表示
Source収録記事
この snippet は記事の「3パターンのコード比較 (動作確認つき) / パターン3: Enum.TryParse + IsDefined — 2段ガードで数字文字列の罠も封じる」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
4 件// これが本番で刺さるやつ foreach (var line in csvLines) { try { var amount = int.Parse(line[2]); // 空欄 / 全角数字 / カンマ入りで FormatException
▶ 実行可
なぜ Parse + try/catch が業務系で刺さるのか
#bbe08af2f511
// 正解 foreach (var line in csvLines) { if (int.TryParse(line[2], out var amount)) { // 業務処理
▶ 実行可
なぜ Parse + try/catch が業務系で刺さるのか
#2a821b7d5eed
string[] inputs = { "1234", "0", "-5", "", "abc", "123", "1,000", null! }; foreach (var s in inputs) { if (int.TryParse(s, out var value)) {
▶ 実行可
パターン1: int.TryParse — 数値変換は bool 戻り値 + out var
#acdf00b7b5e4
using System.Globalization; string[] inputs = { "2026/05/19", "2026-05-19", "2026/5/19", "05/19/2026" };
▶ 実行可
パターン2: DateTime.TryParseExact + InvariantCulture — ロケール事故をゼロに
#c52514aef32b
