※ビルトイン値型の話です。is
as
での安全なキャストとは別です。
C#で文字列を数値や日付にキャストする際、確実に変換できる値かわからないことがあります。
かといってint.Parse
やDateTime.Parse
をtry {...} 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
とインラインで宣言できたので直前の変数宣言が消すことができました。
decimal
やfloat
、double
といった数値型は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("変換できません。");
ただ、DateTime
のTryParse
では書式設定がありません。
"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("変換できません。");