C#のint.Parse()とConvert.ToInt32の違いとは?null値の扱いを徹底解説
C#では、文字列として表現された数値を整数(int型)に変換する際に、int.ParseメソッドまたはConvert.ToInt32メソッドを使用します。どちらも同じ目的で使われますが、変換できない入力が渡された場合の挙動に重要な違いがあります。
int.ParseとConvert.ToInt32の主な違い
両者の最大の相違点はnull値の扱いです。
- Convert.ToInt32:null値を許容します。引数がnullの場合でも例外をスローせず、0を返します。
- int.Parse:null値を許容しません。引数がnullの場合、ArgumentNullException(System.ArgumentNullException)をスローします。
例1:int.Parseによる文字列から整数への変換
class Program {
static void Main() {
int res;
string myStr = "5000";
res = int.Parse(myStr);
Console.WriteLine("Converting String is a numeric representation: " + res);
Console.ReadLine();
}
}
出力結果
Converting String is a numeric representation: 5000
通常の数値文字列であれば、どちらのメソッドも問題なく変換できます。
例2:Convert.ToInt32にnullを渡した場合
class Program {
static void Main() {
int res;
string myStr = null;
res = Convert.ToInt32(myStr);
Console.WriteLine("Converting String is a numeric representation: " + res);
Console.ReadLine();
}
}
出力結果
Converting String is a numeric representation: 0
このように、Convert.ToInt32はnullを受け取ってもエラーにはならず、0を返して正常に処理を続行します。
例3:int.Parseにnullを渡した場合
class Program {
static void Main() {
int res;
string myStr = null;
res = int.Parse(myStr);
Console.WriteLine("Converting String is a numeric representation: " + res);
Console.ReadLine();
}
}
出力結果
Unhandled exception. System.ArgumentNullException: Value cannot be null.
一方、int.Parseにnullを渡すと、ハンドルされていないArgumentNullExceptionが発生し、プログラムが異常終了します。
比較まとめ
| メソッド | null値の場合 | 不正な形式の文字列の場合 |
|---|---|---|
| int.Parse | ArgumentNullExceptionをスロー | FormatExceptionをスロー |
| Convert.ToInt32 | 0を返す | FormatExceptionをスロー |
なお、null以外にも「abc」のような数値として解釈できない文字列を渡した場合は、どちらのメソッドもFormatExceptionをスローする点に注意してください。
補足:安全に変換したいならint.TryParseも検討しよう
変換が成功するかどうか事前にわからない場合は、例外をスローせずbool値で成否を返すint.TryParseを使うと、より堅牢なコードを書けます。
if (int.TryParse(myStr, out int result)) {
Console.WriteLine($"変換成功: {result}");
} else {
Console.WriteLine("変換に失敗しました");
}
まとめ
int.ParseとConvert.ToInt32はどちらも文字列を整数へ変換するメソッドですが、nullに対する挙動が異なる点が実用上の大きな分かれ目です。入力値がnullになり得る場合はConvert.ToInt32、nullや不正な値を明示的にエラーとして扱いたい場合はint.Parse、そして例外処理を避けたい場面ではint.TryParseを選ぶとよいでしょう。
-
MySQLのintとintegerの違いは何?実例でわかる両者の関係
MySQLでは、intとintegerはまったく同じ意味を持つ同義語(シノニム)です。MySQL 5.0以降、どちらのキーワードを使っても内部的にはint(11)として扱われ、保存できる値の範囲もまったく同じになります。 この記事では、実際にテーブルを作成して動作を確認しながら、intとintegerの関係を詳しく解説します。 int型でテーブルを作成する まず、int型のカラムを持つテーブルを作成します。 mysql> create table IntDemo -> ( -> Id int -> ); Query OK, 0 rows affe
-
【C/C++】const int*、const int* const、int const* の違いをわかりやすく解説
C言語やC++では、ポインタとconst修飾子の組み合わせ方によって、複数の異なる変数宣言が存在します。「const int*」「const int* const」「int const*」など、一見よく似たこれらの宣言の違いを正確に理解することは、安全でバグの少ないコードを書くうえで非常に重要です。本記事では、これら3つの宣言の違いを、複雑な宣言を読み解く際に役立つ「時計回り/らせんルール(Clockwise/Spiral Rule)」にも触れながら、コード例とともに分かりやすく解説します。時計回り/らせんルールとは宣言の中心にある識別子から出発し、時計回りに記号をなぞっていくことで、cons