C# 學習筆記 Ref 與 Out 的差別

C# 的兩個 Call by Reference,Ref 與 Out

各位大大安安,早安晚安午安,從二月到現在真正開始接觸C#,之前都是應付作業隨便寫寫的方式
只知道C#有if else,switch,for,while,threads的等基本的東西,從二月在鈦坦實習跟公司裡的工程師學習到了很多
決定要開始把這些學習到的都記錄下來,不然之後都忘記了,比如說..今天,哈哈...

今天要紀錄的是ref和out的差別
在知道ref或out之後有些情況之下我的code可以從左邊變成了右邊,我的Function不需要再多一個回傳的動作給我的變數做替換或使用。
[Note:還是得需要視情況使用Call By Refference或是Call By Value]

先來說說Ref 和 Out 相同的地方

Ref 和 Out 都是 Call By Reference 也就是所謂的 傳址(參考)呼叫

可以在擴充方法時發現這件事情,對於編譯器來說他們倆是相同的,以Code來說的話就會看到下面這樣的情況。

可以發現他們兩個就是不能同時存在的,你無法宣告一樣的方法名稱,你如果在擴充方法同時擴充了ref和out對於編譯器來說的情況就跟下面這張圖是一樣的。

我們可以從官方的文件看到 Ref 和 Out之間的不同之處

傳遞至 ref 參數的引數,在傳遞之前必須先初始化。 這點與 out 參數不同,其引數不需要在傳遞之前先明確初始化。 

如下圖Code範例,意思就是是如果我沒有先將num1的值初始化(左手邊),編譯器就會直接鬧脾氣給你看ˊ_>ˋ
如果將num1賦予初始值,那編譯器就會笑顏展開唷。

接下來是out的使用方式,out的成功編譯的方式不同於ref,out只要在這個方法結束前有賦予其值,就可以編譯,如下圖Code範例。
左手邊看見就算我一開始賦予它值,他還是沒辦法讓我編譯成功。
將Code修正後,我把原本num1的初始化去除(int num1 = 1; 變成 int num1; ),反而在Method中再次初始化num1編譯器是可以成功編譯的。

以上是ref 和 out 的差異,兩種方式都有其適用的情境。就視情況去使用他們唄。
感謝各位大大收看,若有哪些錯誤請幫忙指正我,感謝 :P

整理今天的重點

  • ref 與 out 都是 傳址(參考)呼叫。
  • ref 與 out 在編譯器眼裡是被視為相同的,所以在同時使用時會發生錯誤
  • ref 參數需要先初始化才能將其變數傳入方法中
  • out 參數只要在方法內賦予其初始值,編譯就可以成功