演習 - TryParse() メソッドを調べる
- 12 分
データを扱うとき、文字列データから数値データ型への変換が必要になる場合があります。 前のユニットで学習したように、文字列データ型では数値以外の値を保持できるため、string から数値データ型に変換するとランタイム エラーが発生することがあります。
コード例を次に示します。
string name = "Bob";
Console.WriteLine(int.Parse(name));
次の例外が発生します。
System.FormatException: 'Input string was not in a correct format.'
フォーマットの例外を回避するには、ターゲットのデータ型の TryParse() メソッドを使用します。
TryParse() の使用
TryParse() メソッドでは、いくつかの処理が同時に行われます。
- 指定された数値データ型に文字列を解析することが試行されます。
- 成功した場合は、変換された値を out パラメーターに格納してください。これについては、次のセクションで説明します。
- これにより、アクションが成功したか、失敗したかを示す
bool値が返されます。
ブール値の戻り値を使用して値に対してアクション (計算など) を行ったり、解析に失敗した場合は、メッセージを表示したりすることができます。
注意
この演習では、int データ型を使用しますが、同様の TryParse() メソッドをすべての数値データ型で利用できます。
Out パラメーター
メソッドから値を返したり、何の値も返されないという意味の "void" を返したりすることができます。 また、out パラメーター経由で値を返すこともできます。これは入力パラメーターと同じように定義されますが、out というキーワードが含まれます。
文字列に TryParse() を実行して int に変換する
前の演習のコードをすべて削除するか、行コメント演算子
//を使ってコメントアウトしてください。Visual Studio Code エディターで次のようにコードを更新してください。
string value = "102"; int result = 0; if (int.TryParse(value, out result)) { Console.WriteLine($"Measurement: {result}"); } else { Console.WriteLine("Unable to report the measurement."); }次のコード行を調べてください。
if (int.TryParse(value, out result))outパラメーターを指定してメソッドを呼び出すとき、変数の前にキーワードoutを使用する必要があります。これによって値が保持されます。outパラメーターは、コードresult(int.TryParse(value,out result内の)変数に割り当てられます。 その後、変数outを使用して、コードの残りの部分全体でresultパラメーターに含まれる値を使用できます。int.TryParse()メソッドは、true変数stringを正常にvalueに変換した場合はintを返します。それ以外の場合はfalseを返します。 そこで、このステートメントをifステートメントで囲み、適宜、決定ロジックを実行します。変換後の値は、
int変数resultに格納されます。int変数resultはこのコード行の前に宣言され、初期化されます。そのため、 ステートメントとifステートメントに属するコード ブロックの "else" からと "外" からの両方からアクセスできるはずです。outキーワードからは、TryParse()メソッドでは従来の方法のみで (戻り値として) 値が返されるだけでなく、この 2 方向パラメーター経由で出力も伝えられるということがコンパイラに指示されます。コードを実行すると、次の出力が表示されます。
Measurement: 102
解析された int をコードの後半で使用する
前に宣言された
result変数がoutパラメーターによって設定され、コードの後半でも使用できることを示すには、Visual Studio Code エディターで次のようにコードを更新してください。string value = "102"; int result = 0; if (int.TryParse(value, out result)) { Console.WriteLine($"Measurement: {result}"); } else { Console.WriteLine("Unable to report the measurement."); } Console.WriteLine($"Measurement (w/ offset): {50 + result}");Visual Studio Code の [ファイル] メニューで、[保存] を選択します。 コードをビルドまたは実行する前に、Program.cs ファイルを保存する必要があります。
[エクスプローラー] パネルで、TestProject フォルダーの場所にあるターミナルを開くには、TestProject を右クリックし、[統合ターミナルで開く] を選択します。 ターミナル パネルが開き、ターミナルが TestProject フォルダーの場所に対して開かれていることを示すコマンド プロンプトが含まれているはずです。
コードを実行するには、ターミナルのコマンド プロンプトで、「dotnet run」と入力し、Enter キーを押します。
注意
"実行するプロジェクトが見つかりませんでした" というメッセージが表示された場合は、ターミナルのコマンド プロンプトに、予期されている TestProject フォルダーの場所が表示されていることを確かめます。 例:
C:\Users\someuser\Desktop\csharpprojects\TestProject>次の出力が表示されます。
Measurement: 102 Measurement (w/ offset): 152前のサンプルのコードの最後の行
Console.WriteLine($"Measurement (w/ offset): {50 + result}");を確認してください。result変数は if ステートメントの外部で定義されているため、その後のコードでアクセスできます。
文字列変数を解析できない値に変更する
最後に、他のシナリオを見てみましょう。このシナリオでは、TryParse() に変換できない不適切な値を意図的に int に与えます。
最初のコード行を変更し、変数
valueを別の値に再初期化してください。string value = "bad";また、2 つ目のメッセージを表示する前に結果が確実に 0 より大きくなるように、最後のコード行を変更します。
if (result > 0) Console.WriteLine($"Measurement (w/ offset): {50 + result}");コード例の全体は、次のコードと一致するはずです。
string value = "bad"; int result = 0; if (int.TryParse(value, out result)) { Console.WriteLine($"Measurement: {result}"); } else { Console.WriteLine("Unable to report the measurement."); } if (result > 0) Console.WriteLine($"Measurement (w/ offset): {50 + result}");コード ファイルを保存してから、Visual Studio Code を使ってコードを実行してください。 次のような結果になります。
Unable to report the measurement.前のサンプルで追加された最後の 2 行のコードを調べてください。
if (result > 0) Console.WriteLine($"Measurement (w/ offset): {50 + result}");resultはifステートメントの外部で定義されているため、resultは、コード ブロックの外部でコードの後半にアクセスできます。 そのため、resultがゼロより大きい値であることを確認してから、result+ オフセットを出力として書き込むことができます。result値がゼロより大きいことを確認すると、Unable to report the measurement.メッセージより後にオフセット値が出力されないようにすることができます。
要点
TryParse() メソッドは役に立つツールです。 次の知識を覚えておいてください。
- 文字列を数値データ型に変換するとき、
TryParse()を使用します。 - 変換に成功すると
TryParse()からはtrueが返され、失敗するとfalseが返されます。 - Out パラメーターは、値を返すメソッドの二次的な手段を提供します。 この場合、
outパラメーターからは変換後の値が返されます。 outパラメーターが定義されたメソッドに引数を渡すときは、キーワードoutを使用します。