首先先粗淺的解釋一下三者的分別
out:入參只需宣告,不需初始化參數。方法內必須給定入參的值。只能修飾變數(常數值與方法、委派皆不可用),方法執行完成後,將修改入參的值。若要傳回複數資料 C#7.0後建議使用 tuple
ref:傳遞參數的位址。入參需初始化參數,方法內可以不調整入參值。只能修飾變數(常數值與方法、委派皆不可用)
in:C#7.2新增。傳遞參數的位址。入參不允許修改。
out、in 還可修飾泛型,意思不同,不可搞混
ref 也還可修飾方法與struct
一般入參未帶任何修飾詞時為傳值方法,方法內會新建變數並將入參的值放入變數中。因此方法內與方法外的變動不互相影響。
加入out修飾詞後入參會以引數的方式傳遞,告知方法結束後要將該參數傳回。因此方法外只需宣告,而方法內需新建該變數,以便結束後傳回。
加入ref修飾詞則入參會以傳址方法送入,方法內與方法外所使用的變數為同一記憶體位址,故所有修改皆會連帶變動方法外的原始變數。
in修飾詞在入參使用上,有加與不加兩種用法。
不加表示允許方法建立一個暫存變數去嘗試隱含型別的轉換(子類轉為父類 如int轉uint ),因此也可以使用常數當作入參。加上時則同ref,直接傳遞入參的位址。
in 與 ref 相同是以傳址的方法帶入方法內,因此方法中不會在創建一份而是與方法外共用相同的原始變數。
當傳入的參數是複雜的型別或大型資料流時,可以減少內存的消耗。與 ref 的差異在於 ref 允許修改而 in 則不允許修改。
補充
匿名方法(包含Lambda)中不能使用參數修飾詞
當入參為參考型別(refrece type)時,因原本內存存的就是位址,所以即便沒加上ref 修飾詞依然會變動到入參的資料