程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 淺談值類型和引用類型在堆和棧中的存儲二

淺談值類型和引用類型在堆和棧中的存儲二

編輯:C#入門知識

前一篇我們淺談了“堆”和“棧”,這篇文章我們主要談一下值類型和引用類型在作為參數傳遞時候,有什麼不同。

主要分為兩種情況:

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也發生改變。

 

 

好了,暫時就介紹到這裡,如果有什麼疑問,或者有誤的地方,歡迎大家指點和交流。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved