今天在寫項目任務的時候,遇到了這樣的問題:在訪問網站各個頁面的過程中,需要用ajax檢測用戶當前的登錄狀態,如果沒有登錄則某些操作會受限。這時就需要從session中取得登錄時保存的用戶名。從session中獲取當前登錄用戶名的方法如下:
public static string GetCurrentUserName(HttpContext context) { return context.Session[CURRENTUSERNAME].ToString(); }
平常我一直是這么用的,直接用ToString()方法進行類型轉換,但是今天就出了問題,報錯內容 “未將對象引用設置到對象的實例”(多么熟悉的錯誤啊)。我就想不通了,后來到網上查了很久才看到解決方法:
public static string GetCurrentUserName(HttpContext context) { return (string)context.Session[CURRENTUSERNAME]; }
沒想到(string)顯示轉換和ToString()還有這么大的區別,都怪基礎不扎實啊。然后在網上找到了一篇文章,對這個問題解釋的非常詳細:
[轉]Object到String類型轉換的四種方式
通常object到string有四種方式:(假設有object obj)obj.ToString,Convert.ToString,(string)obj,obj as string。
他們都能將object對象轉換成string對象。我就講講他們的異同以及在實際中應該使用哪個。
前兩個方法通常是由別的對象得到string對象,它們間的區別只表現在要轉換的對象為null時,如果obj為null,調用obj.ToString方法會導致NullReferenceException異常,調用Convert.ToString不會拋出異常而返回一個null。
用強制轉換(string)obj要求obj的運行時類型必須是string。如果不是,就會拋出異常。用as方法則會相對平穩,當obj的運行時類型不是string時會返回null而不拋出異常。
所以在通常在我們需要得到某個對象的string表達形式時,我們應該使用ToString和Convert.ToString,這時候你就得根據情形選一個,假如你能保證你的對象不為null,則兩個差不多。如果有可能為null,你就應該用Convert.ToString,如果你希望它為null的時候拋出異常,那么當然可以選擇.ToString。
如果我們是將一個string對象放在容器(如Session)中,而取出時是object對象,這時我們必須將之轉換回string對象,那么我建議使用as或(string)obj強制轉換。如果我們用.ToString,那么我們就必須在使用前先檢查是否為null,而使用.ToString和Convert.ToString有可能隱藏錯誤,比如你可能用一個username標識一個user的名字,即string類型,但可能你會在另一處無意寫下Session["username"]=(另一個對象),於是你在后面取這個值的時候便取到后面的這個值,由於你是用的.ToString,所以仍然會成功運行,只是值已不是你希望的值,於是錯誤在不知不覺中隱藏過去了。如果你是用的as,這時候你取到的就是null值,如果你是用的(string)obj強制轉換,則會拋出異常。這樣我們才能發現這個異常。
總之,我們應該了解它們之間的區別,具體在用時才能選最適合的一個。