C#
 Computer >> コンピューター >  >> プログラミング >> C#

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.ParseArgumentNullExceptionをスローFormatExceptionをスロー
Convert.ToInt320を返すFormatExceptionをスロー

なお、null以外にも「abc」のような数値として解釈できない文字列を渡した場合は、どちらのメソッドもFormatExceptionをスローする点に注意してください。

補足:安全に変換したいならint.TryParseも検討しよう

変換が成功するかどうか事前にわからない場合は、例外をスローせずbool値で成否を返すint.TryParseを使うと、より堅牢なコードを書けます。

if (int.TryParse(myStr, out int result)) {
   Console.WriteLine($"変換成功: {result}");
} else {
   Console.WriteLine("変換に失敗しました");
}

まとめ

int.ParseConvert.ToInt32はどちらも文字列を整数へ変換するメソッドですが、nullに対する挙動が異なる点が実用上の大きな分かれ目です。入力値がnullになり得る場合はConvert.ToInt32、nullや不正な値を明示的にエラーとして扱いたい場合はint.Parse、そして例外処理を避けたい場面ではint.TryParseを選ぶとよいでしょう。

  1. 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

  2. 【C/C++】const int*、const int* const、int const* の違いをわかりやすく解説

    C言語やC++では、ポインタとconst修飾子の組み合わせ方によって、複数の異なる変数宣言が存在します。「const int*」「const int* const」「int const*」など、一見よく似たこれらの宣言の違いを正確に理解することは、安全でバグの少ないコードを書くうえで非常に重要です。本記事では、これら3つの宣言の違いを、複雑な宣言を読み解く際に役立つ「時計回り/らせんルール(Clockwise/Spiral Rule)」にも触れながら、コード例とともに分かりやすく解説します。時計回り/らせんルールとは宣言の中心にある識別子から出発し、時計回りに記号をなぞっていくことで、cons