c# ref和out 詳解

前言

數據在內存中,存在兩種狀態,堆和棧中。堆中的數據是可以直接拿到的,一般稱引用對象。

這些對象有一個特徵,那就是經過函數處理之後,這些數據在主線程中改變了。好奇點好了,爲什麼棧中的數據就不會改變呢?難道是沒有計算?

其實計算機哪有這麼聰明,不過是找了個替代者----形參。可以說就像古代上戰場抓壯丁一樣,總有些替代者,戰場無論生死和原來沒有去的那個人沒有任何關係。

這就形成了一種特殊情況了,那麼特殊情況下就擁有侷限性,所以出現了ref和out。

正文

ref和out到底是啥?有什麼區別。

區別:ref是傳的的是地址。是地址那麼就有地標和名稱,比如說經度緯度定位到某個地方。

所以有一個規定就是ref必須賦值然後才能調用,爲什麼會有這個規定呢,或者說是不是必須有這個規定呢。

是的,必須的,很簡單,如果一個地址沒有對應到棧中的參數,它在賦值的時候就需要往堆中分配一個,而函數其實就是一個對象,會分配相應的堆區,這些區是會被釋放的,所以任何修改沒有任何意義。

out 是啥?out是這樣的。就像一個門外漢,在外面等,等給他東西。爲何out不能傳值?假設out傳遞了值,那麼他是這樣的,在函數中創建了一個形參,並分配了一個棧,可以說是一個新的對象。這時候好像回到了原點。那麼這個out是這樣做的,out的確是分配了函數的棧,但是它不釋放。

優點:兩者都可以讓傳入函數的值類型得到改變。缺點:性能肯定是下降了。

對於string的優化

string有一種方式,叫做stringbuild,這個關鍵字是引用類型,可以解決一下string的問題,性能比ref和out好點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章