前一段時間寫了一篇,最近這本書都沒怎麼看它了,呵,書一買回來時會翻幾頁,而看完的書卻真的是少之又少,再加上看書的時間並不多,天天又是面對這些專業書,也夠無聊的。不過這些書對增加些基本知識確實是大有用處的,對基礎的紮實理解才能達到更高的境界,像人家老外寫的書,不同凡響,總是每一處都寫得非常的細緻,而且對整個架構的理解也非常透徹,一眼望雲,國人能做到的有幾人?還有就是最近裝上了IE7,這163部落格在寫文章的時候選選擇標籤的時候會有點問題,可能是網易開發人員沒考慮到IE7的相容性CSS,搞得很不爽。
廢話這麼多,進入讀書正題吧,當看到實值型別和參考型別時,就有一些想法了,“實值型別和參考型別之間的一個根本差異是:前者的執行個體被分配於堆棧,後者則只不過是一個位於堆棧的引用,指向(代表)一個被分配於堆的實值。”
要理解這句話確實是不容易,如果單獨紿我這樣一句話我會莫名,其實到現在我對於堆和堆棧的瞭解也甚少,或是說根本不瞭解,一般說來,我理解的是實值型別的聲明都是用系統的實值型別聲明的,有Byte,Char,Int16,Int32,Int64,UInt16,UInt32,UInt64,Single,Double,Decimal,Enum,Boolean,而參考型別聲明一般是類,介面,數組,委託,不過好像枚舉是實值型別的,在將實值型別轉換為參考型別時稱為裝箱(Boxing)。
換句話說,實值型別是放在堆棧中的,供程式調用的,而參考型別,實際值是放在堆中,而引用地址放在堆棧中,堆棧變數所使用的記憶體會在其建立者返回時自動釋放,而分配於堆中的變數,並不會自動釋放記憶體,它們的記憶體將通過一個記憶體回收機制(garbage collection)的處理過程而被釋放。
所以,我們通常在方法中傳參數時,如果參數是實值型別,一般不會改變原來變數的值,而如果是參考型別,會改變值。比如:
public void Sum(int x,int y)
{
x = 1;
}
調用
int x=0,y=0;
Sum(x,y);
這個時候X的值還是0
如果傳的是參考型別
public class a
{
public int a=1;
}
public void gg(a x)
{x.a = 100;}
調用
a x = new a();
gg(x);
這個時候,對象X中的變數a已經是100了。
呵,好了,其實注意這些,有的時候對你困惑了好久認為不可理解的問題會一下子就理解了。呵!其實實值型別和參考型別不僅僅是在C#會遇到的問題,還記得嗎,C也是這樣的,不過他用的應該是指標吧!哎,什麼時候有時間再回味一下C!