佐々木屋

技術的なことから趣味まで色々書きます

型変換は何を使う?(その②)

型変換は何を使う?(その①)の続きです。
sasaki816.hatenablog.com

数値型で有意なParse、TryParse

数値型はnullは許容しませんので、関数化できるならTryParse一択だと思います。但し、string型からの変換のみ利用できることと、TryParseはout引数を持ちますので、変数宣言がひとつ必要となります。

public decimal NL(string value) {
    decimal res;
    if (decimal.TryParse(value, out res)) {
        return res;
    }
    else {
        return 0;
    }
}
Public Function NL(ByVal value As String) As Decimal
    Dim res As Decimal
    If Decimal.TryParse(value, res) Then
        Return res
    Else
        Return 0
    End If
End Function

nullの時(エラーの時)何を返すのか?がミソですね。


なお、null許容型であればC#VB.NETで少し処理が異なります。VB.NETの場合はIf文による条件分岐かnull条件演算子が有用ですが、C#の場合はnull合体演算子が使用できます。

nullを許容するConvertクラス

Convertクラスはnullが来ても例外が発生しません。例えばint32へのキャストの場合、nullの時は0を返します。よって、評価後の振る舞いそして意図しない結果を返してしまう恐れがありますので注意が必要です。

string a = "123";
string b = null;
Console.WriteLine(Convert.ToInt32(a));
Console.WriteLine(Convert.ToInt32(b));
Dim a As String = "123"
Dim b As String = Nothing
Console.WriteLine(Convert.ToInt32(a))
Console.WriteLine(Convert.ToInt32(b))
123
0

そもそもParseでもDirectCastでも、構造化例外をしっかり立てればnullを許容する必要はないので、Convertクラスを利用しなければならないような場面は少ないです。逆にnullでも0を返してしまいますので、局所的な部分でなければ正直使いにくいクラスですね。

文字列変換専用のToString

書式設定付きで変換するならToStringが一番適しています。但し、nullは許容していませんので、必要に応じて構造化例外処理が必要となります。

int a = 12345;
DateTime b = new DateTime(2019, 4, 1);
Console.WriteLine(a.ToString("#,0"));
Console.WriteLine(b.ToString("yyyyMMdd"));
Dim a As Integer = 12345
Dim b As DateTime = New Date(2019, 4, 1)
Console.WriteLine(a.ToString("#,0"))
Console.WriteLine(b.ToString("yyyyMMdd"))
12,345
20190401