目次
bool.TryParse()
を使った堅牢なブール値変換
文字列をブール値に変換することは、特にユーザー入力や外部データソースを処理する際に、C#で頻繁に行われるタスクです。文字列はしばしば暗黙的にブール状態(”true”、”false”、”1″、”0″)を表します。最も堅牢なアプローチは、bool.TryParse()
メソッドを活用することです。
bool.TryParse()
は、例外をスローすることなく変換を試みます。成功するとtrue
を返し、結果のブール値をout
パラメーターに格納します。それ以外の場合はfalse
を返します。これにより、適切なエラー処理が可能になります。
string strTrue = "True";
string strFalse = "false";
string invalidString = "hello";
bool result;
if (bool.TryParse(strTrue, out result))
{
Console.WriteLine($"変換成功: {result}"); // 出力: 変換成功: True
}
else
{
Console.WriteLine("変換失敗");
}
if (bool.TryParse(strFalse, out result))
{
Console.WriteLine($"変換成功: {result}"); // 出力: 変換成功: False
}
else
{
Console.WriteLine("変換失敗");
}
if (bool.TryParse(invalidString, out result))
{
Console.WriteLine($"変換成功: {result}");
}
else
{
Console.WriteLine("変換失敗"); // 出力: 変換失敗
}
このメソッドは、予期しない入力によるクラッシュを防ぐため、そのエラー耐性のために推奨されます。変換失敗を適切に処理し、おそらく情報的なエラーメッセージを表示したり、デフォルトのブール値を使用したりすることができます。
直接変換メソッド: bool.Parse()
とConvert.ToBoolean()
bool.TryParse()
が堅牢性のために推奨されますが、bool.Parse()
とConvert.ToBoolean()
はより簡潔で、許容範囲の狭い代替手段を提供します。
bool.Parse()
は文字列を直接変換します。”True”、”False”、”true”、”false”、”1″、”0″を受け入れます(”True”と”False”は大文字と小文字を区別しません)。無効な入力に対してはFormatException
をスローします。
string strTrue = "True";
bool boolTrue = bool.Parse(strTrue); // true
Convert.ToBoolean()
は同様に動作しますが、null
入力をfalse
を返すことで処理し、ArgumentNullException
を回避します。
string strNull = null;
bool boolNull = Convert.ToBoolean(strNull); // false
しかし、どちらのメソッドも、予期しない入力文字列を処理する上で、bool.TryParse()
よりも柔軟性が低く、エラーが発生しやすいです。
様々な文字列表現の処理
アプリケーションがブール値の様々な文字列表現をどのように処理するかは重要です。既に説明したメソッドは”true”、”false”、”1″、”0″を受け入れますが、”yes”、”no”、”Y”、”N”、またはカスタム表現など、様々なバリエーションが発生する可能性があります。このような場合は、switch
文や辞書ルックアップを使用して、変換前に入力文字列を正規化するカスタム前処理を追加することを検討してください。
例えば、”yes”と”no”に対応するには:
string input = "yes";
string normalizedInput = input.ToLower();
bool result;
if (normalizedInput == "yes" || normalizedInput == "true" || normalizedInput == "1")
{
result = true;
}
else if (normalizedInput == "no" || normalizedInput == "false" || normalizedInput == "0")
{
result = false;
}
else
{
// 無効な入力を処理する
result = false; // または例外をスローする
}