LoginSignup
26
21

More than 3 years have passed since last update.

C#で確実に変換できるかわからない時は、TryParse と out var を使おう

Last updated at Posted at 2018-06-14

※ビルトイン値型の話です。is asでの安全なキャストとは別です。

C#で文字列を数値や日付にキャストする際、確実に変換できる値かわからないことがあります。
かといってint.ParseDateTime.Parsetry {...} catch {...}すると重いです。

その場合、TryParseメソッドが便利です。

文字列を数値に変換する

ユーザーの入力を2倍にし表示するコンソールアプリのコードです。

var line = Console.ReadLine();
int num;
if (int.TryParse(line, out num))
    Console.WriteLine($"{line}の2倍は{num * 2}です");
else
    Console.WriteLine($"{line}は整数に変換できません");

TryParseメソッドの直前で変数の宣言を行っています。(int num;
この変数の宣言は以下のようにインライン化することができます。

var str = Console.ReadLine();
if (int.TryParse(str, out var num))
    Console.WriteLine($"{str}の2倍は{num * 2}です");
else
    Console.WriteLine($"{str}は整数に変換できません");

out var numとインラインで宣言できたので直前の変数宣言が消すことができました。

decimalfloatdoubleといった数値型はTryParseメソッドを持っているので同様にキャストできます。

文字列を日付に変更する

DateTimeも同様にTryParseメソッドを持っています。

var line = Console.ReadLine();
if (DateTime.TryParse(line, out var dateTime))
    Console.WriteLine($"変換できました。Year:{dateTime.Year} Month:{dateTime.Month} Day:{dateTime.Day}");
else
    Console.WriteLine("変換できません。");

ただ、DateTimeTryParseでは書式設定がありません。
"2018/06/10"といった文字列は変更できますが、"2017年06月10日"といった文字列はキャストできません。

その場合、TryParseExactを使います。

using System;
using System.Globalization;

var line = Console.ReadLine();
if (DateTime.TryParseExact(
    line,
    "yyyy年MM月dd日",
    CultureInfo.InvariantCulture,
    DateTimeStyles.None,
    out var dateTime))
    Console.WriteLine($"変換できました。Year:{dateTime.Year} Month:{dateTime.Month} Day:{dateTime.Day}");
else
    Console.WriteLine("変換できません。");
26
21
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
21