2023年3月31日 星期五

[C#]參數傳參考類型、ref傳址 觀念釐清

        之前工作專案吃了基本功差的虧,雖然當下已經查出問題原因並釐清觀念。但一直想找機會再好好的想一下,所以趁最近空閒來寫這篇文章並再次整理觀念。

結論:即使是參考類型有加ref關鍵字,傳遞方式就和原本不一樣。寫個簡單Console就可以看出,如下圖:

 

結果:

        可以明顯看出結果不一樣,如要了解這箇中原由,則需簡單講一下stack(堆疊)、heap(堆積)、變數在記憶體儲存方式等觀念。參考類型的變數在記憶體儲存會像下圖,會在stack儲存變數,並紀錄指向到heap記憶體位址。

由上圖可看出一般在傳遞參考類型(stringBuilder1)時,其實是複製出一個有相同的heap位址的變數(sb1),來執行function裡面的運算。當function裡面執行到new關鍵字時,會讓sb1指向到新的object3 heap位址。此時兩個變數的關係就已經脫鉤了,所以最後WriteLine stringBuilder1值時只會顯示object1值。

再來看當加上ref關鍵字時,就不是採複製的方式。而是讓function變數(sb2)紀錄指向到原本變數(stringBuilder2)的stack位址,而在執行new關鍵字時,就會讓原變數(stringBuilder2)指向到新的object4 heap位址,WriteLine結果也會顯示成object4值。


沒有留言:

張貼留言