這篇沒有啥技術深度,只是看到太多人誤用,所以想出來解釋一下。
這篇沒有啥技術深度,只是看到太多人誤用,所以想出來解釋一下。
有好一陣子常看到類似以下的程式碼
Int32 result = 0; Int32 x; if (Int32.TryParse(textBox1.Text, out result)) { x = Int32.Parse(textBox1.Text); } else { x = 0; }
會這樣寫的狀況,恐怕都是沒有搞清楚 out 關鍵字 (out 參數修飾詞) 的意義是什麼。在C#中呼叫方法 (Method) 時若是使用傳參考的方式,要不用ref 就是用 out (我知道在Unsafe Mode 你可能會用指標,但此不在討論之列),這兩個有點小小的差別是使用 ref 需要在呼叫前先初始化;而使用 out 前不需初始化,但是以 out 為引數的方法一定要在其方法的實做內容中初始化該引數的變數。MSDN 文件庫中對此有一個解釋:雖然當做 out 引數傳遞的變數不需要在傳遞之前先初始化,但需要在方法傳回之前呼叫方法以指派值。
這代表在實值型別的狀況下,遵循out關鍵字原則所撰寫的方法,該方法的內容實作一定會為其以out關鍵字傳遞的引數給予該變數一個初值;而參考型別的狀況下一定會在內容中實作建立該型別的執行個體,除非你寫錯。
以Int32.TryParse為例,我相信在它的方法實作內容中一定有 result=0; 也就是說,如果你傳一個無法轉換為Int32的字串進去,它必然會指派一個 0 給 result 引數,而既然正常的狀況它就會指派轉換後正確的值給result,說實話也不必要再Int32.Parse一次了。所以請改成這種寫法直接取得 result 值就好了,不要無謂地浪費電腦的運算能力。
Int32 result; Int32.TryParse(textBox1.Text, out result);
MSDN文件庫參考資料
(2) ref (C# 參考)