C#雜記 — 參數修飾詞 in、out、ref

莊創偉
2 min readSep 24, 2019

--

首先先粗淺的解釋一下三者的分別

out:入參只需宣告,不需初始化參數。方法內必須給定入參的值。只能修飾變數(常數值與方法、委派皆不可用),方法執行完成後,將修改入參的值。若要傳回複數資料 C#7.0後建議使用 tuple

ref:傳遞參數的位址。入參需初始化參數,方法內可以不調整入參值。只能修飾變數(常數值與方法、委派皆不可用)

in:C#7.2新增。傳遞參數的位址。入參不允許修改。

out、in 還可修飾泛型,意思不同,不可搞混
ref 也還可修飾方法struct
out實例
ref實例

一般入參未帶任何修飾詞時為傳值方法,方法內會新建變數並將入參的值放入變數中。因此方法內與方法外的變動不互相影響。

加入out修飾詞後入參會以引數的方式傳遞,告知方法結束後要將該參數傳回。因此方法外只需宣告,而方法內需新建該變數,以便結束後傳回。

加入ref修飾詞則入參會以傳址方法送入,方法內與方法外所使用的變數為同一記憶體位址,故所有修改皆會連帶變動方法外的原始變數。

in實例
in修飾詞在入參使用上,有加與不加兩種用法。
不加表示允許方法建立一個暫存變數去嘗試隱含型別的轉換(子類轉為父類 如int轉uint ),因此也可以使用常數當作入參。
加上時則同ref直接傳遞入參的位址

inref 相同是以傳址的方法帶入方法內,因此方法中不會在創建一份而是與方法外共用相同的原始變數。
當傳入的參數是複雜的型別或大型資料流時,可以減少內存的消耗。與 ref 的差異在於 ref 允許修改而 in 則不允許修改。

補充

匿名方法(包含Lambda)中不能使用參數修飾詞
當入參為參考型別(refrece type)時,因原本內存存的就是位址,所以即便沒加上ref 修飾詞依然會變動到入參的資料

--

--

莊創偉

學海無涯。但是為了生計還是得下海的風塵男子