【c#】ParseするよりTryParseのほうがいい

タイトルのとおり、ParseよりもTryParseを使ったほうがいい。てな話。

コード

class testClass
{
    public void testMethod()
    {
        string num = "1234";
        string character = "あああ";

        useTryParse(num);
        useParse(num);

        useTryParse(character);
        useParse(character);
    }

    public void useTryParse(string str)
    {
        int nReceive = 0;

        int.TryParse(str,out nReceive);

        Console.WriteLine("{0}は[" + nReceive + "]に変換されました", str);
    }

    public void useParse(string str)
    {
        int nReceive = 0;

        nReceive = int.Parse(str);

        Console.WriteLine("{0}は[" + nReceive + "]に変換されました", str);
    }
}

出力

1234は[1234]に変換されました
1234は[1234]に変換されました
あああは[0]に変換されました
'System.FormatException' の初回例外が mscorlib.dll で発生しました。

こんなカンジで、数値変換できない文字列を渡してParseを使おうとすると例外が発生して止まる。

回避するには、

    public void useParse(string str)
    {
        int nReceive = 0;

        nReceive = int.Parse(str);

        Console.WriteLine("{0}は[" + nReceive + "]に変換されました", str);
    }

    public void useParse(string str)
    {
        int nReceive = 0;
        try
        {
            nReceive = int.Parse(str);
            Console.WriteLine("{0}は[" + nReceive + "]に変換されました", str);
        }
        catch(FormatException e)
        {
            Console.WriteLine("変換中に例外が発生しました。{0}",e.Message);
        }
    }

こうすればいいんだけど、このためだけにtry-catchで囲むくらいなら、素直にTryPaeseを使えばいい。

TryParceは、数値変換できない文字列を渡しても例外を出さないからアプリは止まらない。

で。

「いやいや、変換に失敗したならそれはチェックしたい」

なら、それこそTryPaeseの戻り値は変換結果のbool値だから、結果はそれで見るといい。

    public void useTryParse(string str)
    {
        int nReceive = 0;

        int.TryParse(str,out nReceive);

        Console.WriteLine("{0}は[" + nReceive + "]に変換されました", str);
    }

    public void useTryParse(string str)
    {
        int nReceive = 0;

        if(int.TryParse(str,out nReceive))
        {
            Console.WriteLine("{0}は[" + nReceive + "]に変換されました", str);
        }
        else
        {
            Console.WriteLine("変換に失敗しました");
        }
    }

まぁこうなるとコード量としては微差だけど…

とはいえ。

やっぱTryParseがあるのにParseを使う意味はあまり感じないな。

これマジ。