值類型的存儲位置和聲明它的類型有關。當Main()執行的時候,會分配一個棧區,如果在Main()裡面聲明了值類型,那麼它就會保存在這個棧上;如果Main()先聲明了一個struct,而struct裡面聲明了值類型,那麼這個值類型也一樣保存在棧上,因為聲明這個值類型的類型即struct也在棧上;而如果聲明值類型的類型是一個引用類型,比如一個類,那麼這個值類型就會保存在堆上。
賦值時的區別
引用類型賦值是一種淺拷貝,只是將引用類型的地址傳遞了過去,比如A = B,那麼A、B的操作都會相互影響。當然,string是一種特例,賦值或者傳參後不會相互影響。如果你想引用類型也能執行深拷貝,就要自己寫Clone()方法了。
空間分配及回收
堆和棧這裡的區別具體不解釋,可以查看相關文檔,這裡引用一位前輩的比喻來看出:
使用棧就象我們去飯館裡吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等准備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。
使用堆就象是自己動手做喜歡吃的菜肴,比較麻煩,但是比較符合自己的口味,而且自由度大。比喻很形象,說的很通俗易懂,不知道你是否有點收獲。
以下是我想的兩個例子,如果你都能答對且明白原理,則說明你至少理解了堆棧。
1、引用類型賦值,修改某一個引用類型,會有什麼結果
static void Main(string[] args) { var my = new MyInt(); var you = my; you.index = 1; you = null; Console.WriteLine(my.index.ToString()); Console.ReadLine(); } public class MyInt { public int index; }
結果是:1;而且沒有返回異常。(重點是為什麼沒發生異常)?
2、引用類型傳遞和指針傳遞(ref代表傳遞的是指針)的區別
static void Main(string[] args) { Program main = new Program(); var my = new MyInt(); main.CommonMethod(my); Console.WriteLine(my.index.ToString()); main.RefMethod(ref my); Console.WriteLine(my.index.ToString()); Console.ReadLine(); } public void CommonMethod(MyInt myInt) { myInt.index = 1; myInt = null; } public void RefMethod(ref MyInt myInt) { myInt.index = 2; myInt = null; } public class MyInt { public int index; }
結果是1,然後異常;(為什麼引用類型傳遞不異常,而指針傳遞異常)?
數據結構的棧和內存中的棧有什麼區別嗎?網上說數據結構的棧是一個理論,一個是實現方式,那麼數據結構中的隊列,在內存中有什麼實現呢?還是說網上的說法是錯誤的?
希望大神們幫我解釋一下。