ParseとTryParse
.NET Frameworkには、文字列を数値など別の型のデータに変換するためのメソッド(Parse、TryParse)があります。
この2つのメソッドは、「文字列をある型のデータに変換する」ことが目的です。
実装方法や動作に多少の違いがあります。
C#のint型の場合(int.Parse、int.TryParse)
それぞれ、下記のように宣言されています。
// int.Parse public static int Parse( string s ) // int.TryParse public static bool TryParse( string s, out int result )
この2つのメソッドは、文字列(string s)の中身が、「int型に変換できない文字列」だったときに動作が大きく異なります。
代表的な「変換できない文字列」として、空文字列(“”)だった場合で、変換処理を行ってみます。
int.Parseで文字列を数値に変換する
このようなコードを実装しました。
private void btnTest_Click(object sender, EventArgs e) { // [Test]ボタンを押したときの処理 string s = txtData.Text; // テキストボックスから文字列を取得する int data = -1; // 変換後の数値を格納する変数 data = int.Parse(s); }
ここで、txtData.Textが空文字列(“”)だった場合、例外が発生します。
発生する例外は、’FormatException’(入力文字列の形式が正しくありません)というものです。
int.Parseで例外処理を追加する
では、int.Parseで例外が発生した場合のための「例外処理」を実装してみます。
private void btnTest_Click(object sender, EventArgs e) { // [Test]ボタンを押したときの処理 string s = txtData.Text; // テキストボックスから文字列を取得する int data = -1; // 変換後の数値を格納する変数 try { data = int.Parse(s); } catch (FormatException exception) { // 例外発生 MessageBox.Show(string.Format("変換中に例外が発生しました。rn"{0}"", exception.Message)); return; } }
こうすれば、変換できない文字列でも例外は表示されませんが、例外そのものは発生しています。
int.TryParseに置き換えてみる
先ほどのコードを、int.TryParseの呼び出しに置き換えてみました。
private void btnTest_Click(object sender, EventArgs e) { // [Test]ボタンを押したときの処理 string s = txtData.Text; // テキストボックスから文字列を取得する int data = -1; // 変換後の数値を格納する変数 int.TryParse(s, out data); }
この場合、変数 s が空文字列(“”)でも例外は発生しません。
そして、このときの変数 data の値は0(ゼロ)でした。
ですが、このままではtxtData.Textで入力したものが「0という数値を入力した」のか、「空文字列で変換した結果、0になってしまった」のかの判別ができません。
int.TryParseは戻り値がbool型で、
- trueの場合、変換に成功した。
- falseの場合、変換に失敗した。
という識別が可能です。
コードでは、変数’data’をint.TryParseにそのまま渡していました。
これでは、変換に失敗した場合、int.TryParseでの変換前の変数’data’の値が判らなくなります。
(変換に失敗した場合は、元の値に戻す必要があるときに、値を元の値に戻すことができなくなってしまいます)
int.TryParseを使った最終的なコード
最終的なコードはこのようになります。
private void btnTest_Click(object sender, EventArgs e) { // [Test]ボタンを押したときの処理 string s = txtData.Text; // テキストボックスから文字列を取得する int data = -1; // 変換後の数値を格納する変数 int temp = -1; // 変換のための一時的な変数 if (!int.TryParse(s, out temp)) { // 変換できなかった MessageBox.Show(string.Format("変換できない文字列でした。rn文字列:"{0}"", s); return; } // 変換に成功したので値を更新します data = temp; }
結果
int.Parseは、変換元の文字列が「確実にint型に変換できること」を前提にしないと、例外が発生する可能性がある。
int.TryParseは、変換に失敗した場合の処理を実装しておく必要がある。
ということになります。