當需將物件轉換成字串我們最常使用Object.ToString()來取得轉換後的結果。但當Object是null時,系統就會丟出NullReferenceException,因為我們不能將null轉換成字串。
常見的情況發生於讀取資料庫欄位資料時,如果欄位設定為nullable,當我們在程式碼中嘗試用DataReader["ColumnName"].ToString()去讀出字串資料時,就有可能會出現NullReferenceException。
解決的方法有幾個:
 public static string ToString(object value, 
IFormatProvider provider)
public static string ToString(object value, 
IFormatProvider provider) 
 {
{ 
 IConvertible 
convertible = value as IConvertible;
    IConvertible 
convertible = value as IConvertible; 
 if (convertible != null)
    if (convertible != null) 
 {
    { 
 return convertible.ToString(provider);
        return convertible.ToString(provider); 
 }
    } 
 IFormattable 
formattable = value as IFormattable;
    IFormattable 
formattable = value as IFormattable; 
 if (formattable != null)
    if (formattable != null) 
 {
    { 
 return formattable.ToString(null, provider);
        return formattable.ToString(null, provider); 
 }
    } 
 if (value != null)
    if (value != null) 
 {
    { 
 return value.ToString();
        return value.ToString(); 
 }
    } 
 return string.Empty;
    return string.Empty; 
 }
} 
以執行速度來說,根據Brad Abrams的測試,ToString()會比Convert.ToString()快些,由上面的程式碼可以知道為什麼。因為少了null checking。
結論
當不確定所轉換的物件是否為null時,可以用Convert.ToString()來做轉換,以避免系統拋出例外訊息;當確信物件不為null時,直接使用ToString()即可。
解決的方法有幾個:
- 先對DataReader["ColumnName"]做null 
checking,再根據結果做ToString()或回傳空字串(或其它有意義的字串)。
 
- 永遠將欄位設為有預設值(如空字串或其它數值資料)而不要允許null欄位
 
- 使用Convert.ToString()來做轉換
以執行速度來說,根據Brad Abrams的測試,ToString()會比Convert.ToString()快些,由上面的程式碼可以知道為什麼。因為少了null checking。
結論
當不確定所轉換的物件是否為null時,可以用Convert.ToString()來做轉換,以避免系統拋出例外訊息;當確信物件不為null時,直接使用ToString()即可。
 
沒有留言:
張貼留言