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