C#を用いたアプリケーション開発において、外部から入力された文字列を数値型に変換する操作は、最も頻繁に行われる処理の一つです。
ユーザーが入力フォームに入力した値や、テキストファイルから読み込んだデータ、Web APIから取得したレスポンスなど、あらゆる場面で「文字列から整数への変換」が必要になります。
C#では、この変換を実現するためにint.Parseメソッドやint.TryParseメソッドが用意されていますが、これらを適切に使い分けることはプログラムの堅牢性を高める上で非常に重要です。
本記事では、int.Parseの基本的な使い方から、変換に失敗した際の例外処理、さらにはパフォーマンスに優れたint.TryParseとの比較について詳しく解説します。
2026年現在のモダンなC#開発においても通用する、最適なデータ変換のベストプラクティスを学んでいきましょう。
int.Parseの基本と動作原理
int.Parseは、引数として渡された文字列を32ビット符号付き整数(int型)に変換するためのメソッドです。
このメソッドは、対象の文字列が確実に数値として解釈できる場合に利用するのが一般的です。
基本的な構文は非常にシンプルであり、変換したい文字列を引数に指定するだけで戻り値として数値を得ることができます。
まずは、最も標準的な変換のコード例を見てみましょう。
// 基本的なint.Parseの使用例
string numericString = "12345";
int result = int.Parse(numericString);
Console.WriteLine($"変換結果: {result}");
Console.WriteLine($"型: {result.GetType().Name}");
変換結果: 12345
型: Int32
上記の例では、文字列「12345」が正しく整数型の12345に変換されています。
しかし、int.Parseは入力文字列が数値として正しくない場合に、プログラムの実行を中断させる「例外」をスローするという特徴があります。
そのため、どのような文字列が渡されるか分からない状況で無計画に使用すると、アプリケーションのクラッシュを招く恐れがあります。
数値として認識されない文字列の例
int.Parseが成功するためには、文字列が整数として解釈可能な形式である必要があります。
例えば、全角数字、記号、アルファベット、あるいは小数点を含む文字列をint.Parseに渡すとエラーが発生します。
以下のコードは、変換に失敗する典型的なケースを示しています。
// 変換に失敗する例
string invalidString = "123.45"; // 小数点が含まれている
// int result = int.Parse(invalidString); // ここで例外が発生する
整数型であるintは小数部分を保持できないため、小数点が含まれる文字列は「正しい形式ではない」と判断されます。
また、空文字列やnullを渡した場合も同様にエラーとなります。
int.Parseで発生する主な例外とその原因
int.Parseを使用する際に避けて通れないのが、例外(Exception)への対処です。
このメソッドがスローする主な例外は、以下の3種類に分類されます。
| 例外名 | 発生原因 |
|---|---|
| FormatException | 文字列が数値として解釈できない形式である場合(アルファベット混在など)。 |
| OverflowException | 数値がint型の範囲(-2,147,483,648 ~ 2,147,483,647)を超えている場合。 |
| ArgumentNullException | 引数に渡された文字列が null である場合。 |
FormatException(形式エラー)
FormatExceptionは、文字列の中に数字以外の文字が含まれている場合に発生します。
例えば、”ABC”といった文字列や、”100円”といった単位付きの文字列を変換しようとすると、この例外がスローされます。
ユーザーからの直接入力を受け付ける場合は、最も頻繁に遭遇するエラーと言えるでしょう。
OverflowException(範囲外エラー)
OverflowExceptionは、解析された数値がint型の許容範囲を超えたときに発生します。
C#のint型は32ビットであるため、約21億を超える値を扱うことはできません。
非常に大きな数値を扱う可能性がある場合は、long.Parseを使用して64ビット整数として処理することを検討してください。
ArgumentNullException(null 参照)
ArgumentNullExceptionは、メソッドにnullが渡された場合に発生します。
データベースのNULL値や、初期化されていない変数をそのまま渡すとこのエラーになります。
事前にnullチェックを行うか、null許容型を適切に扱う必要があります。
例外を回避する安全な変換:int.TryParseの活用
例外処理(try-catch)を使用してエラーを回避することも可能ですが、例外の発生はパフォーマンス上のコストが非常に高いという欠点があります。
そこで推奨されるのが、int.TryParseメソッドの使用です。
int.TryParseは、変換の成否を論理値(bool)で返し、変換結果はoutパラメータを通じて受け取ります。
TryParseの基本的な書き方
int.TryParseを使用すると、例外を発生させることなく、安全に条件分岐を行うことができます。
string input = "999";
// TryParseによる安全な変換
if (int.TryParse(input, out int numericValue))
{
// 変換に成功した場合の処理
Console.WriteLine($"変換成功: {numericValue}");
}
else
{
// 変換に失敗した場合の処理
Console.WriteLine("変換に失敗しました。有効な数字を入力してください。");
}
この方法であれば、たとえ入力が「あいうえお」のような無効な文字列であっても、プログラムが停止することはありません。
現代のC#開発において、ユーザー入力を数値に変換する際はTryParseを使用するのが鉄則となっています。
ParseとTryParseの使い分け基準
どちらのメソッドを使用すべきかは、そのデータが「数値でないことがあり得るか」という基準で判断します。
状況に応じた使い分けのガイドラインを以下にまとめました。
int.Parseを使うべき場面
プログラムのロジック上、その文字列が絶対に数値であるはずという強い前提がある場合に使用します。
例えば、プログラム内部で生成した設定値や、あらかじめバリデーション済みのデータなどが該当します。
もしそこで変換に失敗するならば、それはプログラムのバグを意味するため、例外を発生させて早期に問題を検知すべきです。
int.TryParseを使うべき場面
入力元が信頼できない場合、あるいは数値以外のデータが混ざる可能性がある場合に使用します。
ユーザーのキーボード入力、外部のテキストファイル、ネットワーク経由で受信した不安定なデータなどが代表例です。
例外によるオーバーヘッドを避け、プログラムの実行を継続したい場合に最適です。
効率的な例外処理と実装のテクニック
どうしてもint.Parseを使用し、かつ例外に対処しなければならない場合は、適切なtry-catchブロックを構成します。
全ての例外をExceptionクラスでまとめてキャッチするのではなく、原因ごとに個別の処理を記述するのが望ましい作法です。
try
{
string data = "2147483648"; // intの最大値を超える値
int val = int.Parse(data);
}
catch (FormatException)
{
Console.WriteLine("数値の形式が正しくありません。");
}
catch (OverflowException)
{
Console.WriteLine("数値が大きすぎて処理できません。");
}
catch (ArgumentNullException)
{
Console.WriteLine("データが空です。");
}
このように記述することで、エラーの原因に応じた適切なユーザーフィードバックを提供することが可能になります。
高度な変換:NumberStylesとCultureInfoの指定
int.Parseには、数値の書式を細かく制御するためのオーバーロードが存在します。
例えば、通貨記号が含まれている場合や、3桁ごとのカンマ区切りが含まれている文字列を変換したい場合があります。
System.Globalization.NumberStyles列挙型を使用することで、これらを柔軟に処理できます。
using System.Globalization;
string money = "1,500";
// カンマを許可して変換
int price = int.Parse(money, NumberStyles.AllowThousands);
Console.WriteLine($"変換結果: {price}");
変換結果: 1500
また、国や地域によって数値の表記ルール(小数点の記号など)が異なるため、CultureInfoを明示的に指定することも重要です。
グローバルなアプリケーションを開発する際は、CultureInfo.InvariantCultureを指定することで、実行環境に左右されない一貫した変換動作を保証できます。
2026年における最新の変換手法:ReadOnlySpanの活用
近年の.NET開発では、パフォーマンスの最適化が非常に重視されています。
特に大量の文字列データを解析する際、文字列の切り出し(Substring)を行うと、その都度新しい文字列メモリが割り当てられ、GC(ガベージコレクション)に負荷をかけます。
これを防ぐために、ReadOnlySpan<char>を利用した変換手法が普及しています。
ReadOnlySpan<char> source = "ID:12345".AsSpan();
// "12345"の部分だけをメモリコピーなしで参照
ReadOnlySpan<char> slice = source.Slice(3);
if (int.TryParse(slice, out int id))
{
Console.WriteLine($"IDの抽出成功: {id}");
}
この手法は、ログファイルの解析や高頻度なパケット処理など、速度が求められるシナリオで極めて有効です。
int.Parseやint.TryParseは、従来のstringだけでなくReadOnlySpan<char>を直接受け取ることができるようになっているため、積極的に活用しましょう。
まとめ
C#における文字列から数値への変換は、シンプルながらも奥の深いテーマです。
int.Parseは簡潔で強力ですが、変換失敗時の例外スローというリスクを伴います。
一方でint.TryParseは、安全かつ高効率に変換処理を行えるため、実務開発における第一選択肢となります。
最後に、本記事の内容を振り返りましょう。
- int.Parseは、確実に数値と分かっているデータに対して使用する。
- int.TryParseは、ユーザー入力などの不確実なデータに対して使用し、例外を回避する。
- 変換エラーにはFormatException、OverflowException、ArgumentNullExceptionの3種類がある。
- カンマ区切りなどの特殊な形式を扱う場合はNumberStylesを活用する。
- パフォーマンスが重要な場面ではReadOnlySpanを利用した最新の変換手法を検討する。
これらの知識を適切に使い分けることで、エラーに強く、メンテナンス性の高いC#プログラムを記述できるようになります。
日々のコーディングにおいて、入力データの性質を常に意識し、最適なメソッドを選択する習慣を身につけてください。
