2014/04/06

【C#】いろんな型変換(キャスト)Convert vs Parse vs ToString

プログラミングを行ううえで使う頻度が高いのが型変換(キャスト)。

基本的なキャストには以下のようなものがある。
Convert.ToInt32(object);
int.Parse(string);
object.ToString();
どれも型変換に使うメソッドだが、それぞれ特徴がある。

例えば、ParseやToStringはNullを渡すとエラーになる。
しかし、Convertは0や空白が返ってくる。

そんな特徴を理解しながら使わないと……


今までは以下のようなメソッドを作って型変換時のエラーを回避していた。
private string ConvertToString(object obj)
{
    if (obj == null)
    {
        return  stirng.Empty;
    }
    else
    {
        return obj.ToString();
    }
}

これがConvertを使うを以下のようになる。
Convert.String(object);

とはいってもConvertも万能でなく、String.Emptyを渡して数値型に変換しようとするとエラーになる。







いろんな型変換


Convert、Parse、ToStringの特徴は以下の通り。

string value0 = null;
string value1 = string.Empty;
string value2 = "abc";
string value3 = "123";

//----------------------------------
//【Convert】
//   引数がObject型でも変換できる
//----------------------------------

// 0
Console.WriteLine(Convert.ToInt32(value0));

// FormatException: 入力文字列の形式が正しくありません。
//Console.WriteLine(Convert.ToInt32(value1));

// FormatException: 入力文字列の形式が正しくありません。
//Console.WriteLine(Convert.ToInt32(value2));

// 123
Console.WriteLine(Convert.ToInt32(value3));
#endregion


//----------------------------------
//【Parse】
//   引数がString型のみ変換できる
//----------------------------------

// ArgumentNullException: 値を Null にすることはできません。
//Console.WriteLine(int.Parse(value0));

// FormatException: 入力文字列の形式が正しくありません。
//Console.WriteLine(int.Parse(value1));

// FormatException: 入力文字列の形式が正しくありません。
//Console.WriteLine(int.Parse(value2));

// 123
Console.WriteLine(int.Parse(value3));


//----------------------------------
//【ToString】
//    引数がObject型でも変換できる
//----------------------------------

// NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。
//Console.WriteLine(value0.ToString());

// Empty(未入力)
Console.WriteLine(value1.ToString());

// abc
Console.WriteLine(value2.ToString());

// 123
Console.WriteLine(value3.ToString());





例外知らずの型変換


先の型変換ではそれぞれ与える引数により例外は発生していた。
その例外を一切発生させないためには、以下の様な実装方法が良いかも。

他に良いアイデアがありましたら、教えてください。

static void Main(string[] args)
{
    string value0 = null;
    string value1 = string.Empty;
    string value2 = "abc";
    string value3 = "123";

    //----------------------------------
    // ConvertToString
    //----------------------------------
    Console.WriteLine(ConvertToString(value0));
    Console.WriteLine(ConvertToString(value1));
    Console.WriteLine(ConvertToString(value2));
    Console.WriteLine(ConvertToString(value3));

    //----------------------------------
    // ConvertToInt
    //----------------------------------
    Console.WriteLine(ConvertToInt(value0));
    Console.WriteLine(ConvertToInt(value1));
    Console.WriteLine(ConvertToInt(value2));
    Console.WriteLine(ConvertToInt(value3));
}

static string ConvertToString(object value)
{
    if (value == null)
    {
        return string.Empty;
    }
    else
    {
        return value.ToString();
    }
}

static int ConvertToInt(object value)
{
    int result;
    if (int.TryParse(ConvertToString(value), out result))
    {
        return Convert.ToInt32(value);
    }
    else
    {
        return 0;
    }
}





以上

0 件のコメント :

コメントを投稿