一.什麼是值類型?什麼引用類型? 1.值類型的值是存儲在棧上的。引用類型是存在堆上的。 2.值類型變數聲明之後,不管是否已經分配記憶體,編譯器在堆上為其分配記憶體。 3.引用類型聲明的時候,這時候只在棧中分配一小片記憶體用於容納一個地址,此時候並沒有為其分配堆上的記憶體地址,當new一個實例的時候,真正創建 ...
一.什麼是值類型?什麼引用類型?
1.值類型的值是存儲在棧上的。引用類型是存在堆上的。
2.值類型變數聲明之後,不管是否已經分配記憶體,編譯器在堆上為其分配記憶體。
3.引用類型聲明的時候,這時候只在棧中分配一小片記憶體用於容納一個地址,此時候並沒有為其分配堆上的記憶體地址,當new一個實例的時候,真正創建時候,才在堆 上分配記憶體空間,並把堆上空間的地址保存到棧上分配的小片空間中。
4.現實中,比如你再報紙上看到一份報紙,發了一個有趣的內容要分享給朋友,你可以在買一份讓你朋友看,這時候你和朋友就可以分享到同樣的內容,但是從兩份獨立的報紙上,但是如果你在網頁上瀏覽信息的時候,發現了有趣的內容,你會直接把Url發給你的朋友的,這時候你和你的朋友看到的是相同的內容,是從一個網站上看到的。這裡面報紙的例子就是值類型,網頁的例子就是引用類型。值類型的賦值,是完全拷貝了實際內容,而引用類型則只是拷貝了指向實際內容的地址。
5.對於引用類型變數,它的值只是一個引用,而非一個對象。引用就像Url地址一樣指向真實的對象,值類型存儲的就是真實的數據。
誤區:引用類型保存在堆上,值類型保存在棧上。
1.這句話只說對了一半,引用類型是保存在堆上,但是值類型就不一定了。變數的值是在它聲明的位置存儲的,也是說一個類有一個int類型實例變數,那麼這個變數的值總是和對象中的其他數據一起存儲也就是堆上。只有局部變數,和方法內部的變數或者方法參數是在棧上。對於C#2以及更高版本,許多局部變數不完全存在棧上。
寫的時候,可能又遺漏的想不起來的,持續完善中。。。。。。