C#のParseとは?TryParseとの違い・使い方・例外回避まで初心者向けに解説

はじめに

C#でプログラムを書いていると、画面やファイル、APIなどから受け取った文字列を、数値や日付などの型に変換したい場面がよくあります。たとえば、ユーザーが入力した "123" という文字列を計算に使うには、int 型の 123 に変換する必要があります。

このようなときに使う代表的なメソッドが Parse です。C#の Parse は、文字列を指定した型に変換するための基本的な機能です。

一方で、Parse は変換に失敗すると例外が発生します。そのため、ユーザー入力や外部データのように「正しい形式とは限らない値」を扱う場合は、TryParse を使うことがよくあります。

この記事では、csharp parse について調べている初心者向けに、Parse の基本、TryParse との違い、よくあるエラー、例外を避けるための実装方法までわかりやすく解説します。

1. C#のParseとは?文字列を指定した型に変換する基本メソッド

1-1. Parseの役割:stringをint・double・DateTimeなどに変換する

C#の Parse は、文字列を別の型に変換するためのメソッドです。

たとえば、次のような文字列があるとします。

C#
string text = "100";

この時点では、text はあくまで文字列です。そのため、次のような計算にはそのまま使えません。

C#
string text = "100";
// int result = text + 50; // これはできない

文字列 "100" を整数として扱いたい場合は、int.Parse を使います。

C#
string text = "100";
int number = int.Parse(text);

Console.WriteLine(number + 50); // 150

このように、Parse は「文字列として表現されている値」を、実際に計算や比較で使える型に変換する役割を持っています。

1-2. Parseが使われる代表的な場面

Parse は、文字列で受け取ったデータをプログラム内で扱いやすい型に変換する場面で使われます。

代表的な場面は次のとおりです。

場面
ユーザー入力の変換入力された年齢 "25"int にする
CSVファイルの読み込み"1980" を整数、"2024/01/01" を日付にする
設定ファイルの読み込み"true"bool にする
Web APIのレスポンス処理JSON内の文字列値を数値や日付にする
フォーム入力の処理金額や個数を数値として扱う

ただし、これらの場面では入力値が常に正しいとは限りません。たとえば、年齢欄に "abc" と入力される可能性もあります。そのような場合に Parse をそのまま使うと例外が発生するため、TryParse の利用も重要になります。

1-3. Parseで変換できる型の例

C#では、多くの基本型に Parse メソッドが用意されています。

主な例は次のとおりです。

C#
int number = int.Parse("123");
double price = double.Parse("12.34");
decimal amount = decimal.Parse("1000.50");
DateTime date = DateTime.Parse("2024/01/01");
bool flag = bool.Parse("true");

よく使われる型を整理すると、次のようになります。

Parseの例用途
intint.Parse("123")整数
doubledouble.Parse("12.34")小数
decimaldecimal.Parse("1000.50")金額など誤差を避けたい小数
DateTimeDateTime.Parse("2024/01/01")日付・時刻
boolbool.Parse("true")真偽値

Parse は便利ですが、文字列の形式が合っていないと変換できません。たとえば、int.Parse("abc") は失敗します。

1-4. Parseを使う前に押さえたい「型変換」の考え方

C#は型を厳密に扱う言語です。見た目が同じように見えても、文字列の "123" と整数の 123 は別物です。

C#
string text = "123";
int number = 123;

text は文字列なので、文字として扱われます。一方、number は整数なので、計算に使えます。

C#
Console.WriteLine(text + "1");   // 1231
Console.WriteLine(number + 1); // 124

文字列の "123""1" を足すと、文字列として連結されて "1231" になります。整数の 1231 を足すと、数値として計算されて 124 になります。

この違いを理解しておくと、なぜ Parse が必要なのかがわかりやすくなります。

2. C# Parseの基本的な使い方

2-1. int.Parseで文字列を整数に変換する

int.Parse は、文字列を int 型の整数に変換します。

C#
string text = "123";
int number = int.Parse(text);

Console.WriteLine(number); // 123
Console.WriteLine(number + 10); // 133

int.Parse に渡す文字列は、整数として解釈できる必要があります。

C#
int number1 = int.Parse("100");
int number2 = int.Parse("-50");
int number3 = int.Parse("0");

次のような文字列は、基本的には int.Parse で変換できません。

C#
// int.Parse("abc");    // エラー
// int.Parse("12.34"); // エラー
// int.Parse(""); // エラー

int は整数型なので、小数を表す "12.34" は変換できません。小数を扱いたい場合は、double.Parsedecimal.Parse を使います。

2-2. double.Parseで小数を扱う

double.Parse は、文字列を double 型の小数に変換します。

C#
string text = "12.34";
double value = double.Parse(text);

Console.WriteLine(value); // 12.34
Console.WriteLine(value * 2); // 24.68

小数を含む計算をしたい場合に使います。

C#
string heightText = "170.5";
double height = double.Parse(heightText);

Console.WriteLine(height);

ただし、小数点の扱いは実行環境のカルチャ設定によって影響を受ける場合があります。日本語環境では通常 "12.34" のような形式が使えますが、国や地域によっては小数点ではなくカンマを使う文化もあります。

より厳密に形式を指定したい場合は、CultureInfo を使うこともあります。

C#
using System.Globalization;

string text = "12.34";
double value = double.Parse(text, CultureInfo.InvariantCulture);

Console.WriteLine(value);

初心者のうちは、まず double.Parse("12.34") の基本形を理解しておけば問題ありません。

2-3. DateTime.Parseで日付文字列を変換する

DateTime.Parse は、文字列を DateTime 型に変換します。

C#
string text = "2024/01/01";
DateTime date = DateTime.Parse(text);

Console.WriteLine(date);

日付として認識できる文字列であれば、DateTime に変換できます。

C#
DateTime date1 = DateTime.Parse("2024/01/01");
DateTime date2 = DateTime.Parse("2024-01-01");
DateTime date3 = DateTime.Parse("2024年1月1日");

ただし、日付形式があいまいな場合は注意が必要です。

C#
DateTime date = DateTime.Parse("01/02/2024");

このような文字列は、環境によって「2024年1月2日」と解釈される場合もあれば、「2024年2月1日」と解釈される可能性もあります。

決まった形式の日付を扱う場合は、DateTime.ParseExactDateTime.TryParseExact を使うと、より安全に変換できます。

2-4. bool.Parseでtrue/falseを変換する

bool.Parse は、文字列を bool 型に変換します。

C#
string text = "true";
bool result = bool.Parse(text);

Console.WriteLine(result); // True

bool.Parse で変換できる代表的な文字列は、"true""false" です。大文字小文字は区別されません。

C#
bool value1 = bool.Parse("true");
bool value2 = bool.Parse("false");
bool value3 = bool.Parse("True");
bool value4 = bool.Parse("False");

ただし、次のような文字列は bool.Parse では変換できません。

C#
// bool.Parse("1");     // エラー
// bool.Parse("0"); // エラー
// bool.Parse("yes"); // エラー
// bool.Parse("no"); // エラー

bool.Parse は、基本的に "true" または "false" の文字列を変換するものと覚えておくとよいでしょう。

2-5. Parseの戻り値と変数への代入方法

Parse は、変換した結果を戻り値として返します。

C#
int number = int.Parse("123");

このコードでは、int.Parse("123") の結果として 123 という int 型の値が返され、それが number に代入されます。

分解すると、次のような流れです。

C#
string text = "123";
int number;

number = int.Parse(text);

Parse の戻り値の型は、呼び出す型によって変わります。

C#
int number = int.Parse("123");                 // int
double price = double.Parse("12.34"); // double
DateTime date = DateTime.Parse("2024/01/01"); // DateTime
bool flag = bool.Parse("true"); // bool

「どの型に変換したいのか」を考えて、int.Parsedouble.ParseDateTime.Parse のように使い分けます。

3. Parseでよく起きるエラーと原因

3-1. FormatException:変換できない文字列を渡した場合

Parse で最もよく発生するエラーが FormatException です。

FormatException は、文字列の形式が変換先の型に合っていない場合に発生します。

C#
string text = "abc";
int number = int.Parse(text); // FormatException

"abc" は整数として解釈できないため、int.Parse に失敗します。

ほかにも、次のような例があります。

C#
// int.Parse("12.34");       // 整数ではない
// double.Parse("hello"); // 小数ではない
// DateTime.Parse("abc"); // 日付ではない
// bool.Parse("yes"); // true/falseではない

Parse を使うときは、文字列が本当に変換できる形式かどうかを意識する必要があります。

3-2. ArgumentNullException:nullを渡した場合

Parsenull を渡すと、ArgumentNullException が発生することがあります。

C#
string text = null;
int number = int.Parse(text); // ArgumentNullException

null は「文字列が存在しない」状態です。空文字 "" とは異なります。

C#
string nullText = null; // 値がない
string emptyText = ""; // 空の文字列

どちらも変換には失敗しますが、原因は異なります。

C#
// int.Parse(nullText);   // ArgumentNullException
// int.Parse(emptyText); // FormatException

実際の開発では、外部から受け取った文字列が null になる可能性があります。Parse の前に string.IsNullOrEmptystring.IsNullOrWhiteSpace でチェックすると安全です。

3-3. OverflowException:型の範囲を超えた値を渡した場合

OverflowException は、変換先の型で扱える範囲を超えた値を渡した場合に発生します。

たとえば、int 型には扱える範囲があります。非常に大きな数値を int.Parse しようとすると失敗します。

C#
string text = "999999999999999999999";
int number = int.Parse(text); // OverflowException

int に収まらない大きな値を扱いたい場合は、longdecimal など別の型を検討します。

C#
string text = "9999999999";
long number = long.Parse(text);

Console.WriteLine(number);

型にはそれぞれ扱える範囲があるため、変換先の型選びも重要です。

3-4. 空文字・全角数字・カンマ付き数値で失敗するケース

初心者がつまずきやすいのが、見た目では数値に見えるのに Parse で失敗するケースです。

たとえば、空文字は変換できません。

C#
string text = "";
int number = int.Parse(text); // FormatException

スペースだけの文字列も失敗します。

C#
string text = "   ";
int number = int.Parse(text); // FormatException

全角数字も注意が必要です。

C#
string text = "123";
int number = int.Parse(text); // 環境や形式によって失敗する可能性がある

また、カンマ付きの数値も単純な int.Parse では意図どおりに変換できない場合があります。

C#
string text = "1,000";
int number = int.Parse(text);

カンマ付き数値を扱う場合は、NumberStyles を指定する方法があります。

C#
using System.Globalization;

string text = "1,000";
int number = int.Parse(text, NumberStyles.AllowThousands);

Console.WriteLine(number); // 1000

ただし、初心者のうちは、まず「入力文字列の形式が合っていないとParseは失敗する」と覚えておくことが大切です。

3-5. Parseのエラー原因を初心者向けに整理

Parse のエラー原因は、大きく分けると次の3つです。

例外主な原因
FormatException形式が合っていない"abc""""12.34"int.Parse
ArgumentNullExceptionnull を渡したint.Parse(null)
OverflowException型の範囲を超えた大きすぎる数値を int.Parse

初心者が特に注意したいのは、FormatException です。

ユーザー入力やCSV、APIなど外部から来る値は、想定どおりとは限りません。そのため、実務では Parse だけでなく、失敗しても例外を出さない TryParse がよく使われます。

4. TryParseとは?Parseとの違いをわかりやすく解説

4-1. TryParseは変換に失敗しても例外を出さない

TryParse は、文字列を指定した型に変換できるか試すメソッドです。

Parse と大きく違う点は、変換に失敗しても例外を出さないことです。

C#
string text = "abc";

bool success = int.TryParse(text, out int number);

Console.WriteLine(success); // False
Console.WriteLine(number); // 0

"abc" は整数に変換できません。しかし、TryParse は例外を発生させず、戻り値として false を返します。

変換に成功した場合は true を返し、変換後の値が out 引数に入ります。

C#
string text = "123";

bool success = int.TryParse(text, out int number);

Console.WriteLine(success); // True
Console.WriteLine(number); // 123

4-2. ParseとTryParseの戻り値の違い

ParseTryParse は、戻り値が大きく異なります。

Parse は、変換後の値そのものを返します。

C#
int number = int.Parse("123");

一方、TryParse は、変換できたかどうかを bool で返します。

C#
bool success = int.TryParse("123", out int number);

整理すると次のようになります。

メソッド戻り値変換後の値
Parse変換後の値戻り値として受け取る
TryParse成功したかどうかの boolout 引数で受け取る

Parse は成功することが前提の書き方です。TryParse は失敗する可能性があることを前提にした書き方です。

4-3. TryParseのout引数とは何か

TryParse で初心者がつまずきやすいのが out 引数です。

次のコードを見てください。

C#
bool success = int.TryParse("123", out int number);

out int number は、「変換に成功したら、その結果を number に入れてください」という意味です。

つまり、TryParse では2つの情報を受け取ります。

1つ目は、変換に成功したかどうかです。

C#
bool success

2つ目は、変換後の値です。

C#
int number

実際には、次のように if 文と組み合わせて使うことが多いです。

C#
string text = "123";

if (int.TryParse(text, out int number))
{
Console.WriteLine(number + 10);
}
else
{
Console.WriteLine("整数に変換できませんでした。");
}

この書き方なら、変換に成功したときだけ number を使えます。

4-4. ParseとTryParseの処理の流れを比較

Parse の処理の流れはシンプルです。

C#
string text = "123";
int number = int.Parse(text);
Console.WriteLine(number);

変換できれば問題ありません。しかし、変換できない値が来ると例外が発生します。

C#
string text = "abc";
int number = int.Parse(text); // ここで例外
Console.WriteLine(number);

一方、TryParse は成功・失敗を判定して処理を分けられます。

C#
string text = "abc";

if (int.TryParse(text, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("数値を入力してください。");
}

Parse は「変換できるはず」と考える場合に使います。TryParse は「変換できないかもしれない」と考える場合に使います。

4-5. 初心者はどちらを使うべきか

初心者には、まず TryParse を優先して使うことをおすすめします。

理由は、プログラムが例外で止まりにくく、安全に処理を書けるからです。

特に、次のような値を扱うときは TryParse が向いています。

データ理由
ユーザー入力入力ミスが起こる可能性がある
CSVファイル空欄や不正な値が含まれる可能性がある
Web API想定外の形式が返る可能性がある
設定ファイル書き間違いがある可能性がある

Parse は便利ですが、失敗すると例外になります。最初のうちは「外部から来た文字列には TryParse を使う」と覚えておくと安心です。

5. TryParseの基本的な使い方

5-1. int.TryParseで安全に整数へ変換する

int.TryParse の基本形は次のとおりです。

C#
bool success = int.TryParse("123", out int number);

変換に成功すると、successtrue になり、number には変換後の値が入ります。

C#
string text = "123";

bool success = int.TryParse(text, out int number);

Console.WriteLine(success); // True
Console.WriteLine(number); // 123

変換に失敗すると、successfalse になります。

C#
string text = "abc";

bool success = int.TryParse(text, out int number);

Console.WriteLine(success); // False
Console.WriteLine(number); // 0

失敗しても例外が発生しないため、安全に処理を続けられます。

5-2. if文とTryParseを組み合わせる書き方

TryParse は、if 文と組み合わせて使うのが一般的です。

C#
string text = "123";

if (int.TryParse(text, out int number))
{
Console.WriteLine("変換に成功しました。");
Console.WriteLine(number);
}
else
{
Console.WriteLine("整数に変換できませんでした。");
}

この書き方では、変換に成功した場合だけ if ブロックの中が実行されます。

C#
if (int.TryParse(text, out int number))
{
// 成功したときの処理
}
else
{
// 失敗したときの処理
}

ユーザー入力のチェックでは、この形をそのまま使うことが多いです。

5-3. out varを使ったシンプルな書き方

C#では、out var を使って変換後の変数を簡潔に書けます。

C#
string text = "123";

if (int.TryParse(text, out var number))
{
Console.WriteLine(number);
}

out var number と書くと、C#が型を推論してくれます。この場合は int.TryParse なので、numberint 型になります。

次のコードとほぼ同じ意味です。

C#
if (int.TryParse(text, out int number))
{
Console.WriteLine(number);
}

初心者のうちは、型が明確に見える out int number のほうが理解しやすいかもしれません。慣れてきたら out var を使うとコードがすっきりします。

5-4. 変換に失敗したときの処理を書く方法

TryParse の大きなメリットは、変換に失敗したときの処理を自然に書けることです。

C#
string input = "abc";

if (int.TryParse(input, out int age))
{
Console.WriteLine($"年齢は{age}歳です。");
}
else
{
Console.WriteLine("年齢は数値で入力してください。");
}

失敗時には、エラーメッセージを表示したり、初期値を使ったりできます。

C#
string input = "abc";
int age;

if (int.TryParse(input, out age))
{
Console.WriteLine($"年齢は{age}歳です。");
}
else
{
age = 0;
Console.WriteLine("入力が不正なため、年齢を0として扱います。");
}

ユーザーに再入力を促す処理を書くこともあります。

C#
Console.WriteLine("年齢を入力してください。");
string input = Console.ReadLine();

if (int.TryParse(input, out int age))
{
Console.WriteLine($"入力された年齢: {age}");
}
else
{
Console.WriteLine("正しい年齢を入力してください。");
}

5-5. ユーザー入力のチェックにTryParseを使う例

コンソールアプリで、ユーザーに数値を入力してもらう例を見てみましょう。

C#
Console.WriteLine("購入数を入力してください。");
string input = Console.ReadLine();

if (int.TryParse(input, out int quantity))
{
int price = 500;
int total = price * quantity;

Console.WriteLine($"合計金額は{total}円です。");
}
else
{
Console.WriteLine("購入数は整数で入力してください。");
}

このコードでは、ユーザーが "3" と入力すれば合計金額を計算できます。

一方、"abc" や空文字を入力した場合でも、例外でプログラムが止まることはありません。else の処理で、わかりやすいメッセージを表示できます。

ユーザー入力を扱う場合は、Parse よりも TryParse のほうが安全です。

6. ParseとTryParseの使い分け

6-1. Parseを使ってよいケース

Parse は、変換できることがほぼ確実な文字列に対して使うのが基本です。

たとえば、プログラム内で固定値として書いている文字列なら、開発者が形式を管理できます。

C#
int number = int.Parse("123");
DateTime date = DateTime.Parse("2024/01/01");

また、事前にバリデーション済みの値であれば、Parse を使っても問題ない場合があります。

C#
string text = "100";

if (int.TryParse(text, out _))
{
int number = int.Parse(text);
Console.WriteLine(number);
}

ただし、この例では最初から TryParse の結果を使えばよいため、実際には次のように書くほうが自然です。

C#
if (int.TryParse(text, out int number))
{
Console.WriteLine(number);
}

Parse は、失敗しない前提が明確な場合に使うものと考えましょう。

6-2. TryParseを使うべきケース

TryParse は、変換に失敗する可能性がある文字列を扱う場合に使います。

特に、次のようなケースでは TryParse が適しています。

C#
string input = Console.ReadLine();

if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("数値を入力してください。");
}

ユーザーが何を入力するかは完全には予測できません。空文字、スペース、アルファベット、不正な記号などが入力される可能性があります。

このような場面で Parse を使うと、例外が発生してプログラムが止まる可能性があります。

C#
string input = Console.ReadLine();
int number = int.Parse(input); // 入力内容によっては例外

外部から来るデータには、基本的に TryParse を使うと覚えておくとよいでしょう。

6-3. ユーザー入力・外部データではTryParseが安全

ユーザー入力や外部データは、常に正しいとは限りません。

たとえば、CSVファイルに次のようなデータがあるとします。

Name,Age
Tanaka,25
Suzuki,
Sato,abc

年齢の列には、空欄や文字列が入っている可能性があります。

このようなデータに int.Parse を使うと、途中で例外が発生します。

C#
string ageText = "abc";
int age = int.Parse(ageText); // 例外

TryParse を使えば、不正な値を検出して処理を分けられます。

C#
string ageText = "abc";

if (int.TryParse(ageText, out int age))
{
Console.WriteLine($"年齢: {age}");
}
else
{
Console.WriteLine("年齢が不正です。");
}

実務では、ユーザー入力、CSV、JSON、Web API、データベースから取得した文字列など、外部由来の値には TryParse を使うのが安全です。

6-4. 固定値・事前に保証された値ではParseも選択肢

Parse がまったく使われないわけではありません。

次のように、コード内で固定されている値や、仕様上必ず正しい形式であると保証されている値では、Parse を使うこともあります。

C#
DateTime campaignStart = DateTime.Parse("2024/04/01");

ただし、日付のように形式の解釈が環境に影響される可能性がある場合は、ParseExact を使ったほうが明確です。

C#
using System.Globalization;

DateTime campaignStart = DateTime.ParseExact(
"2024-04-01",
"yyyy-MM-dd",
CultureInfo.InvariantCulture
);

Parse を使う場合でも、「本当に失敗しない値か」を考えることが大切です。

6-5. try-catchでParseを囲む方法との違い

Parse の例外を避ける方法として、try-catch で囲むこともできます。

C#
try
{
string text = "abc";
int number = int.Parse(text);

Console.WriteLine(number);
}
catch (FormatException)
{
Console.WriteLine("数値に変換できませんでした。");
}

この方法でも例外を処理できますが、単純な入力チェックであれば TryParse のほうが読みやすく、効率的です。

C#
string text = "abc";

if (int.TryParse(text, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("数値に変換できませんでした。");
}

try-catch は、予期しない例外や複雑なエラー処理に使うものです。変換できるかどうかを判定したいだけなら、TryParse を使うほうが自然です。

7. 型別に見るParse・TryParseの実践例

7-1. 文字列をintに変換する例

int は整数を扱う型です。年齢、個数、回数などに使われます。

Parse の例です。

C#
string text = "25";
int age = int.Parse(text);

Console.WriteLine($"年齢: {age}");

TryParse の例です。

C#
string text = "25";

if (int.TryParse(text, out int age))
{
Console.WriteLine($"年齢: {age}");
}
else
{
Console.WriteLine("年齢は整数で入力してください。");
}

ユーザー入力で年齢を受け取る場合は、TryParse を使うのが安全です。

7-2. 文字列をdoubleに変換する例

double は小数を扱う型です。身長、体重、割合などに使われます。

C#
string text = "170.5";
double height = double.Parse(text);

Console.WriteLine($"身長: {height}cm");

TryParse を使う場合は次のように書きます。

C#
string text = "170.5";

if (double.TryParse(text, out double height))
{
Console.WriteLine($"身長: {height}cm");
}
else
{
Console.WriteLine("身長は数値で入力してください。");
}

小数を含む入力も、失敗する可能性がある場合は TryParse を使いましょう。

7-3. 文字列をdecimalに変換する例

decimal は、金額など正確さが求められる数値に使われることが多い型です。

C#
string text = "1200.50";
decimal price = decimal.Parse(text);

Console.WriteLine($"価格: {price}円");

TryParse を使う例です。

C#
string text = "1200.50";

if (decimal.TryParse(text, out decimal price))
{
Console.WriteLine($"価格: {price}円");
}
else
{
Console.WriteLine("価格は数値で入力してください。");
}

金額を扱う場合は、double よりも decimal が選ばれることがよくあります。特に会計や請求金額のように誤差を避けたい場面では decimal を検討しましょう。

7-4. 文字列をDateTimeに変換する例

DateTime は日付や時刻を扱う型です。

C#
string text = "2024/01/01";
DateTime date = DateTime.Parse(text);

Console.WriteLine($"日付: {date}");

TryParse を使う例です。

C#
string text = "2024/01/01";

if (DateTime.TryParse(text, out DateTime date))
{
Console.WriteLine($"日付: {date}");
}
else
{
Console.WriteLine("日付の形式が正しくありません。");
}

日付入力は形式の違いによって失敗しやすいです。ユーザーに入力してもらう場合は、TryParseTryParseExact を使うと安全です。

形式を固定したい場合は、次のように TryParseExact を使います。

C#
using System.Globalization;

string text = "2024-01-01";

if (DateTime.TryParseExact(
text,
"yyyy-MM-dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("yyyy-MM-dd形式で入力してください。");
}

7-5. 文字列をboolに変換する例

booltrue または false を扱う型です。

C#
string text = "true";
bool isActive = bool.Parse(text);

Console.WriteLine(isActive);

TryParse を使う例です。

C#
string text = "true";

if (bool.TryParse(text, out bool isActive))
{
Console.WriteLine($"有効: {isActive}");
}
else
{
Console.WriteLine("trueまたはfalseを入力してください。");
}

bool.Parsebool.TryParse では、"1""0" は基本的に true / false として扱われません。

C#
bool.TryParse("1", out bool result); // false

"1"true"0"false として扱いたい場合は、自分で条件分岐を書く必要があります。

C#
string text = "1";
bool flag;

if (text == "1")
{
flag = true;
}
else if (text == "0")
{
flag = false;
}
else
{
Console.WriteLine("1または0を入力してください。");
}

8. Parseで例外を回避するための実装ポイント

8-1. 変換前にnull・空文字をチェックする

Parse を使う前に、まず null や空文字をチェックすると安全です。

C#
string text = "";

if (!string.IsNullOrEmpty(text))
{
int number = int.Parse(text);
Console.WriteLine(number);
}
else
{
Console.WriteLine("値が入力されていません。");
}

ただし、スペースだけの文字列も入力される可能性があります。

C#
string text = "   ";

この場合は、string.IsNullOrWhiteSpace を使うと便利です。

C#
string text = "   ";

if (!string.IsNullOrWhiteSpace(text))
{
int number = int.Parse(text);
Console.WriteLine(number);
}
else
{
Console.WriteLine("値が入力されていません。");
}

ただし、このチェックだけでは "abc" のような文字列は防げません。数値として変換できるかどうかは、TryParse で確認するのが安全です。

8-2. 数値かどうかをTryParseで判定する

文字列が数値かどうかを判定したい場合は、TryParse を使います。

C#
string text = "123";

if (int.TryParse(text, out int number))
{
Console.WriteLine($"数値です: {number}");
}
else
{
Console.WriteLine("数値ではありません。");
}

この書き方なら、null、空文字、英字、不正な記号などが来ても例外が発生しません。

C#
string text = "abc";

if (int.TryParse(text, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("整数に変換できません。");
}

「数値かどうかを確認してから変換したい」と考える場合は、Parse ではなく TryParse を使うのが基本です。

8-3. 想定外の入力に備えてelse処理を書く

TryParse を使うときは、成功した場合だけでなく、失敗した場合の処理も書きましょう。

C#
string input = "abc";

if (int.TryParse(input, out int number))
{
Console.WriteLine($"入力値: {number}");
}
else
{
Console.WriteLine("整数を入力してください。");
}

else を書かないと、変換に失敗したときに何も起きず、原因がわかりにくくなります。

C#
if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}

このコードでは、失敗した場合に何も表示されません。ユーザーから見ると、なぜ処理されなかったのか分かりません。

失敗時には、メッセージを表示したり、再入力を促したり、デフォルト値を設定したりするとよいでしょう。

8-4. エラーメッセージをユーザーにわかりやすく表示する

エラーメッセージは、ユーザーが次に何をすればよいか分かる内容にすることが大切です。

悪い例です。

C#
Console.WriteLine("エラーです。");

これだけでは、何が悪いのかわかりません。

よい例です。

C#
Console.WriteLine("年齢は半角数字で入力してください。");

日付の場合は、入力形式を具体的に示すと親切です。

C#
Console.WriteLine("日付は yyyy-MM-dd 形式で入力してください。例: 2024-01-01");

数値の範囲が決まっている場合は、範囲も伝えるとよいでしょう。

C#
Console.WriteLine("数量は1以上100以下の整数で入力してください。");

TryParse で型変換をチェックし、その後に範囲チェックをする流れがよく使われます。

C#
string input = "150";

if (int.TryParse(input, out int quantity))
{
if (quantity >= 1 && quantity <= 100)
{
Console.WriteLine($"数量: {quantity}");
}
else
{
Console.WriteLine("数量は1以上100以下で入力してください。");
}
}
else
{
Console.WriteLine("数量は整数で入力してください。");
}

8-5. 例外処理に頼りすぎないコードにする

Parsetry-catch で囲めば、変換失敗時の例外を処理できます。

C#
try
{
int number = int.Parse("abc");
}
catch (FormatException)
{
Console.WriteLine("整数に変換できません。");
}

しかし、入力値が正しいかどうかを確認する目的で、毎回 try-catch を使うのはあまり自然ではありません。

単純な変換チェックなら、TryParse を使うほうが読みやすいです。

C#
if (int.TryParse("abc", out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("整数に変換できません。");
}

例外処理は「通常は起きない異常な状態」を扱うためのものです。ユーザーの入力ミスのように普通に起こり得ることは、TryParse で判定するほうが適しています。

9. 初心者がParse・TryParseでつまずきやすいポイント

9-1. 文字列と数値型の違いがわからない

初心者が最初につまずきやすいのは、文字列と数値型の違いです。

C#
string text = "100";
int number = 100;

見た目はどちらも 100 ですが、意味は違います。

text は文字列なので、文字の並びとして扱われます。number は整数なので、計算に使えます。

C#
Console.WriteLine(text + "50");  // 10050
Console.WriteLine(number + 50); // 150

文字列を数値として計算したい場合に、ParseTryParse が必要になります。

C#
string text = "100";
int number = int.Parse(text);

Console.WriteLine(number + 50); // 150

9-2. out引数の意味がわからない

TryParseout は、変換後の値を受け取るための仕組みです。

C#
bool success = int.TryParse("123", out int number);

このコードでは、success に変換成功かどうかが入り、number に変換後の整数が入ります。

つまり、TryParse は次の2つを同時に返しているようなイメージです。

受け取るもの内容
戻り値変換に成功したかどうか
out 引数変換後の値

実際のコードでは、次の形を覚えておけば十分です。

C#
if (int.TryParse(text, out int number))
{
// ここではnumberを使える
}
else
{
// 変換失敗
}

9-3. TryParseの戻り値と変換後の値を混同する

TryParse の戻り値は、変換後の数値ではありません。

C#
bool result = int.TryParse("123", out int number);

この場合、resulttrue または false です。123 が入るのは number のほうです。

間違った理解をすると、次のように混乱します。

C#
bool result = int.TryParse("123", out int number);

Console.WriteLine(result); // True
Console.WriteLine(number); // 123

TryParse では、戻り値は成功判定、out 引数は変換結果と覚えましょう。

9-4. null・空文字・スペースの扱いで混乱する

null、空文字、スペースは似ているようで違います。

C#
string a = null;   // 値がない
string b = ""; // 空の文字列
string c = " "; // スペースだけの文字列

Parse では、どれも変換に失敗します。

C#
// int.Parse(a); // ArgumentNullException
// int.Parse(b); // FormatException
// int.Parse(c); // FormatException

入力があるかどうかを確認したい場合は、string.IsNullOrWhiteSpace を使うと便利です。

C#
if (string.IsNullOrWhiteSpace(input))
{
Console.WriteLine("値を入力してください。");
}

そのうえで、数値に変換できるかどうかは TryParse で確認します。

C#
if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("整数を入力してください。");
}

9-5. DateTime.Parseで日付形式が合わずに失敗する

DateTime.Parse は便利ですが、日付形式によっては失敗したり、意図しない日付として解釈されたりすることがあります。

C#
DateTime date = DateTime.Parse("2024/01/01");

このような一般的な形式は扱いやすいですが、次のような形式は注意が必要です。

C#
DateTime date = DateTime.Parse("01/02/2024");

この日付が「1月2日」なのか「2月1日」なのかは、文化圏や設定によって解釈が変わる可能性があります。

入力形式を固定したい場合は、DateTime.TryParseExact を使うと安全です。

C#
using System.Globalization;

string input = "2024-01-01";

if (DateTime.TryParseExact(
input,
"yyyy-MM-dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("日付は yyyy-MM-dd 形式で入力してください。");
}

日付の変換では、「どの形式を受け付けるのか」を明確にすることが大切です。

10. Parse・TryParseのよくある質問

10-1. ParseとConvert.ToInt32の違いは?

int.ParseConvert.ToInt32 は、どちらも文字列を整数に変換できます。

C#
int a = int.Parse("123");
int b = Convert.ToInt32("123");

大きな違いの一つは、null の扱いです。

C#
string text = null;

// int.Parse(text); // 例外
int number = Convert.ToInt32(text); // 0

Convert.ToInt32(null)0 を返します。一方、int.Parse(null) は例外になります。

ただし、Convert.ToInt32("abc") のように変換できない文字列を渡すと例外が発生します。

C#
// Convert.ToInt32("abc"); // FormatException

ユーザー入力のように不正な値の可能性がある場合は、Convert.ToInt32 よりも int.TryParse を使うのが安全です。

10-2. int.ParseとInt32.Parseは同じ?

int.ParseInt32.Parse は基本的に同じです。

C#
int a = int.Parse("123");
int b = Int32.Parse("123");

C#の int は、.NETの System.Int32 の別名です。

そのため、次の2つは同じ型を指しています。

C#
int number1 = 123;
Int32 number2 = 123;

普段のC#コードでは、int.Parse と書くことが多いです。特別な理由がなければ、読みやすい int を使えば問題ありません。

10-3. TryParseで失敗したとき変数の値はどうなる?

TryParse で変換に失敗した場合、out 引数にはその型の既定値が入ります。

int の場合は 0 です。

C#
bool success = int.TryParse("abc", out int number);

Console.WriteLine(success); // False
Console.WriteLine(number); // 0

double の場合も 0bool の場合は falseDateTime の場合は既定の日付値になります。

ただし、失敗時の値をそのまま使うのは避けましょう。

C#
if (int.TryParse("abc", out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("変換に失敗しました。");
}

TryParse では、必ず戻り値の true / false を確認してから変換後の値を使うのが基本です。

10-4. 小数や日付でもTryParseは使える?

小数や日付でも TryParse は使えます。

double.TryParse の例です。

C#
string text = "12.34";

if (double.TryParse(text, out double value))
{
Console.WriteLine(value);
}
else
{
Console.WriteLine("小数に変換できません。");
}

decimal.TryParse の例です。

C#
string text = "1000.50";

if (decimal.TryParse(text, out decimal amount))
{
Console.WriteLine(amount);
}
else
{
Console.WriteLine("金額に変換できません。");
}

DateTime.TryParse の例です。

C#
string text = "2024/01/01";

if (DateTime.TryParse(text, out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("日付に変換できません。");
}

TryParseint だけでなく、さまざまな型で使える便利なメソッドです。

10-5. Parseを使わずに型変換する方法はある?

Parse 以外にも、C#には型変換の方法があります。

代表的なものは次のとおりです。

方法特徴
TryParseint.TryParse(...)失敗しても例外を出さない
ConvertConvert.ToInt32(...)nullの扱いなどがParseと異なる
キャスト(int)value数値型同士の変換などに使う
as / isobj as string参照型や型チェックに使う
ParseExactDateTime.ParseExact(...)形式を厳密に指定できる

文字列から数値や日付に変換する場合は、Parse または TryParse が基本です。

失敗する可能性があるなら TryParse、形式が保証されているなら Parse、日付形式を厳密に指定したいなら ParseExactTryParseExact を使い分けましょう。

まとめ

C#の Parse は、文字列を intdoubledecimalDateTimebool などの型に変換するための基本メソッドです。

C#
int number = int.Parse("123");
double value = double.Parse("12.34");
DateTime date = DateTime.Parse("2024/01/01");
bool flag = bool.Parse("true");

ただし、Parse は変換できない文字列を渡すと例外が発生します。

C#
int number = int.Parse("abc"); // FormatException

ユーザー入力や外部データのように、正しい形式かどうかわからない値を扱う場合は、TryParse を使うのが安全です。

C#
if (int.TryParse("123", out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("整数に変換できません。");
}

ParseTryParse の違いを整理すると、次のようになります。

メソッド特徴向いている場面
Parse失敗すると例外が発生する変換できることが保証されている値
TryParse失敗しても例外を出さないユーザー入力や外部データ

初心者は、まず TryParse を優先して使うと安全です。Parse は便利ですが、失敗時に例外が発生するため、入力値が本当に正しい形式かを意識して使う必要があります。

csharp parse を理解するうえで大切なのは、「文字列と数値や日付は別の型であること」「Parseは変換できないと例外になること」「安全に変換したいときはTryParseを使うこと」です。

この3つを押さえておけば、C#での文字列変換処理をより安全で読みやすく書けるようになります。