前一篇我們淺談了“堆”和“棧”,這篇文章我們主要談一下值類型和引用類型在作為參數傳遞時候,有什麼不同。
主要分為兩種情況:
1.傳遞值類型(Passing Value Types)
2.傳遞引用類型(Passing Reference Types)
首先我們來看一下第一種情況,傳遞值類型(Passing Value Types):
x = AddFive(+=
上一篇文章我們已經討論過關於值類型存儲的問題,所以這裡不再過多敘述。
我們都知道,值類型使用的就是數據本身,所以5會被拷貝到pValue。所以最終x的值還是不會改變。
需要謹記的是,如果我們將一個非常大的值類型變量(如一個很大的struct)復制到“棧“上,這對內存空間和處理器處理周期的消耗是很大的,因為”棧“空間並非無限的。
如何解決這種效率低的問題呢?先別慌,讓我們來看一個例子。
= DoSomething( }
看到沒有,DoSomething()方法有一個ref關鍵字。這就引入了我們在傳遞值類型的另外一種情況,值類型按照引用傳遞。
看到沒有,這個時候的pValue就是一個指向x的一個地址指針。
需要小心的是,當我們用引用的方法傳遞一個值參數時,我們訪問的是源參數本身。任何對pValue的改變都是對x的改變。下面這段代碼,會使x.a改變為12345。
= = voidDoSomething(=
接下來我們來看看另外一種情況,傳遞引用類型(Passing Reference Types):
x = = =
最終會輸出12345,發現結果已經被改變。將x的值(位於“堆“上的 MyInt 對象的地址)拷貝至pValue,使x和pValue同時指向MyInt對象的地址。
既然值類型可以使用ref關鍵字,那麼引用類型在使用ref關鍵字的情況下,又是怎麼一回事呢?好的,我們同樣來看一個例子:
= + (x + (x Switcharoo(=
最後程序執行的結果是:
x is Animal:False
x is Vegetable:True
pValue這次是指向x的,然後通過改變x的地址,使得pValue也發生改變。
好了,暫時就介紹到這裡,如果有什麼疑問,或者有誤的地方,歡迎大家指點和交流。