July 4, 2009

Object.ToString()與Convert.ToString()

當需將物件轉換成字串我們最常使用Object.ToString()來取得轉換後的結果。但當Object是null時,系統就會丟出NullReferenceException,因為我們不能將null轉換成字串。常見的情況發生於讀取資料庫欄位資料時,如果欄位設定為nullable,當我們在程式碼中嘗試用DataReader["ColumnName"].ToString()去讀出字串資料時,就有可能會出NullReferenceException。
解決的方法有幾個:
  1. 先對DataReader["ColumnName"]做null checking,再根據結果做ToString()或回傳空字串(或其它有意義的字串)。
     
  2. 永遠將欄位設為有預設值(如空字串或其它數值資料)而不要允許null欄位
     
  3. 使用Convert.ToString()來做轉換
ToString()預設是為沒有做null checking的,而Convert.ToString()會在轉換字串時先對要轉換的物件做null checking。我們可以由 .NET Reflector 這套工具看出,如果物件為null的話Convert.ToString()就會回傳空字串,如下:

        public static string ToString(object value, IFormatProvider provider)
        {
            IConvertible convertible = value as IConvertible;
            if (convertible != null)
            {
                return convertible.ToString(provider);
            }

            IFormattable formattable = value as IFormattable;

            if (formattable != null)
            {
                return formattable.ToString(null, provider);
            }

            if (value != null)
            {
                return value.ToString();
            }

            return string.Empty;
        }

以執行速度來說,根據Brad Abrams的測試,ToString()會比Convert.ToString()快些,由上面的程式碼可以知道為什麼。因為少了null checking。

結論
當不確定所轉換的物件是否為null時,可以用Convert.ToString()來做轉換,以避免系統拋出例外訊息;當確定物件不為null時,直接使用ToString()即可。

No comments: