[.NET]方法參數關鍵字:ref與out的比較

  • 19650
  • 0
  • 2012-06-04

[.NET]方法參數關鍵字:ref與out的差異

前言

先前在Bill的文章:多重委派與桃谷六仙討論串中,帶到了一個點:區域變數宣告後,若不給初始值,就直接使用,C#編譯器會跳編譯錯誤的訊息,請見MSDN上CS0165的說明

以程式碼來說,大概就是長這樣:

image

然而,這突然讓我想到了方法參數宣告成ref與out的差異,會跟這個扯上一點點關係。

 

ref與out相同之處

refout相同的地方,都在於

宣告成ref或out,都會讓方法參數以ByRef的方式傳遞。

這兩種方法以編譯表示時為完全相同。(也就是在方法簽章上,參數宣告為ref與out,將會被視為相同)

在方法簽章宣告與使用方法上,都需要額外宣告關鍵字才能使用。而因為編譯時兩者相同,所以不能宣告一樣的方法名稱,相同的參數個數與型別,一個宣告為ref,另一個宣告為out,會出現編譯錯誤。

image

 

ref與out差異之處

而ref與out的差異呢?先來看MSDN ref的說明

傳遞給 ref 參數的引數必須先被初始化。這點不同於 out,out 的引數在傳遞之前不需先明確初始化

簡單的說:如果宣告為ref,則呼叫方法時,參數要在呼叫方法之前,就要初始化。而out則不需要在傳入之前初始化,out只需要在方法結束前,有初始化out參數即可。

如下方的sample,當呼叫TestRef,i沒有初始化,就會跳與前言中一樣的錯誤。

image

倘若修改為Out呢?就不會出現錯誤。

image

另一種狀況,則是當int i宣告時,便初始化,則呼叫TestRef(ref i); 不會出現錯誤。

image

但,一樣的方法內容,在TestOut(out i);中,便會出現編譯錯誤。

image

 

結論

  1. 方法參數宣告為ref與out時,在編譯時視為相同。
  2. ref與out,都是將參數以ByRef方式傳遞。
  3. ref參數在傳入方法之前,要先初始化完畢。
  4. out參數在方法結束之前,要先初始化完畢。
  5. ref 不會強制要求函式內的程式,一定要修改傳入的參數,但 out 會。(謝謝小朱補充)
  6. 當呼叫宣告為out參數的方法時,不管變數有沒有初始化,都可以傳入方法中執行,只要在方法結束前,方法內參數有初始化,就不會出現編譯錯誤。

blog 與課程更新內容,請前往新站位置:http://tdd.best/