對值類型和引用類型的誤解 (引用類型存儲在堆上,值類型存儲在棧上) 對值類型和引用類型的誤解 (引用類型存儲在堆上,值類型存儲在棧上) 在學習C#基礎篇幅的時候總是逃不掉值類型和引用類型,很多新手包括我以前對它的理解也只是停留在"引用類型存儲在堆上,值類型存儲在棧上". 這個誤區主要歸咎於我們根本沒 ...
-
對值類型和引用類型的誤解 (引用類型存儲在堆上,值類型存儲在棧上)
在學習C#基礎篇幅的時候總是逃不掉值類型和引用類型,很多新手包括我以前對它的理解也只是停留在"引用類型存儲在堆上,值類型存儲在棧上".
這個誤區主要歸咎於我們根本沒有動腦筋,第一句話是正確的,引用類型的實例總是在堆上創建的.但後一句就有問題了.設想假定一個類中有一個int類型的實例變數.
public class User { public int Age { get; set; } }
那麼在這個User類中的該變數的值總是和對象中的其它數據在一起,也就是在堆上. 事實上只有局部變數和方法參數在棧上,但是也有特殊情況 局部變數並不存放
在棧上,比如匿名函數閉包,這些特性不適合新手這裡就不說明瞭.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
Var是動態類型嗎?
這個問題對於JavaScript程式員才學C#的時候很容易混淆.雖然C#不是完全的強類型語言(C#4.0以上允許你使用動態類型),但在C#3.0以下基本還算是強類型語言
在說明var的關鍵字之前,需要大家知道的是 C#2.0是對CLR進行了改動,但在隨後面的版本基本都沒發生重大的改動,這意味著很多後面加入特性都是 編譯器在默默的幫助你,
比如C#3.0引入Var類型. 為了更好的說明Var不是動態類型我還是引入一個實例
static void Main(string[] args) { var str = "Hello, world."; str = 10; }
上述代碼是無法通過編譯的,編譯器會告訴你" 無法將類型“int”隱式轉換為“string".
因為str的類型是String,在編譯時就確定了數據類型,所以你也無法使用下麵這種代碼
static void Main(string[] args) { var obj =null; //聲明空指針 var obj; }
這也證明瞭它確實在編譯時就確定了類型,只是編譯器幫你變的魔術而已 ,因為編譯器是在編譯時推斷的,所以它肯本不知道這是什麼東東,這樣它的魔法就失靈了.
(未完後續補充......)