棧:棧就是一個先入后出的存儲空間,必須按照順序依次執行。比
如一筒羽毛球,只有一個出入口,如果想取出來球,只能先把最后塞入的那個球拿出來才能繼續拿其他的球。值類型的存儲位置和聲明它的類型有關。當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,然后異常;(為什么引用類型傳遞不異常,而指針傳遞異常)?
數據結構的棧和內存中的棧有什么區別嗎?網上說數據結構的棧是一個理論,一個是實現方式,那么數據結構中的隊列,在內存中有什么實現呢?還是說網上的說法是錯誤的?
希望大神們幫我解釋一下。
新聞熱點
疑難解答