TryParse 的誤用

這篇沒有啥技術深度,只是看到太多人誤用,所以想出來解釋一下。

       這篇沒有啥技術深度,只是看到太多人誤用,所以想出來解釋一下。

 

       有好一陣子常看到類似以下的程式碼

            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文件庫參考資料

       (1) out 參數修飾詞 (C# 參考)

       (2) ref (C# 參考)