※ビルトイン値型の話です。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("変換できません。");