在學(xué)習(xí)C#基礎(chǔ)篇幅的時(shí)候總是逃不掉值類(lèi)型和引用類(lèi)型,很多新手包括我以前對(duì)它的理解也只是停留在"引用類(lèi)型存儲(chǔ)在堆上,值類(lèi)型存儲(chǔ)在棧上".
這個(gè)誤區(qū)主要?dú)w咎于我們根本沒(méi)有動(dòng)腦筋,第一句話是正確的,引用類(lèi)型的實(shí)例總是在堆上創(chuàng)建的.但后一句就有問(wèn)題了.設(shè)想假定一個(gè)類(lèi)中有一個(gè)int類(lèi)型的實(shí)例變量.
(如下代碼)
1 public class Person2 {3 public int Age { get; set; }4 }那么在這個(gè)Person類(lèi)中的該變量的值總是和對(duì)象中的其它數(shù)據(jù)在一起,也就是在堆上.事實(shí)上只有局部變量和方法參數(shù)在棧上,但是對(duì)于c#2.0更高版本,很多局部變量并不完全存放
在棧上,比如匿名函數(shù)閉包,這些特性不適合新手這里就不說(shuō)明了.
這個(gè)問(wèn)題對(duì)于javaScript程序員才學(xué)C#的時(shí)候很容易混淆.雖然C#不是完全的強(qiáng)類(lèi)型語(yǔ)言(C#4.0以上允許你使用動(dòng)態(tài)類(lèi)型),但在C#3.0以下基本還算是強(qiáng)類(lèi)型語(yǔ)言
在說(shuō)明var的關(guān)鍵字之前,需要大家知道的是 C#2.0是對(duì)CLR進(jìn)行了改動(dòng),但在隨后面的版本基本都沒(méi)發(fā)生重大的改動(dòng),這意味著很多特性都是編譯器在默默的幫助你,
比如C#3.0引入Var類(lèi)型.為了更好的說(shuō)明Var不是動(dòng)態(tài)類(lèi)型我還是引入一個(gè)實(shí)例
1 static void Main(string[] args)2 {3 4 var str = "Hello, world.";5 6 str = 10;7 8 }上述代碼是無(wú)法通過(guò)編譯的,編譯器會(huì)告訴你"無(wú)法將類(lèi)型“int”隱式轉(zhuǎn)換為“string".
因?yàn)閟tr的類(lèi)型是String,在你寫(xiě)申明str變量的時(shí)候就已經(jīng)確定了類(lèi)型了,那么var到底有什么用呢?
之所以使用Var隱式類(lèi)型,原因很簡(jiǎn)單,它減少代碼的輸入量,這意味增加了可讀性,尤其在涉及泛型時(shí),類(lèi)型名稱(chēng)變的相當(dāng)長(zhǎng),我還是引入一個(gè)實(shí)例
1 static void Main(string[] args)2 {3 4 //未使用var變量前5 Dictionary<List<int>, IEnumerable<Person>> dic1 = new Dictionary<List<int>, IEnumerable<Person>>();6 7 //使用var變量后8 var dic2 =new Dictionary<List<int>, IEnumerable<Person>>();9 }可以看出使用了var的變量確實(shí)可讀性更好了,還減少了代碼量(但是并不是在任何地方都可以濫用var類(lèi)型)
在聲明dic2變量的時(shí)候,實(shí)際上它是在編譯時(shí)就確定了類(lèi)型,而不是發(fā)生在運(yùn)行時(shí),為了證明這點(diǎn)你可以把鼠標(biāo)光標(biāo)移到到var上 VS就會(huì)提示你使用的類(lèi)型
如圖

這也證明了它確實(shí)在編譯時(shí)就確定了類(lèi)型,只是編譯器幫你變的魔術(shù)而已.如果還是感到懷疑的同學(xué)可以聲明一個(gè)var number; 試試看看它是否能通過(guò),答案肯定是否定的
因?yàn)榫幾g器是在編譯時(shí)推斷的,所以它肯本不知道這是什么東東,這樣它的魔法就失靈了.
還要說(shuō)明的是var不是所有的場(chǎng)景都可以推斷,實(shí)際上它有缺點(diǎn),這里就不列出了.
不要濫用var隱式類(lèi)型
例子說(shuō)明
static void Main(string[] args) { //不能直觀的知道number是什么類(lèi)型 var number = getValue(); }上面的代碼在維護(hù)的時(shí)候不能直觀的知道number是什么類(lèi)型的變量,而需要將光標(biāo)移到var上才能知道.影響閱讀
好了 暫時(shí)就說(shuō)這么多了,先洗洗睡了.如果基佬們喜歡,我后面還會(huì)列出更多常見(jiàn)誤區(qū),如果有什么說(shuō)的不對(duì)的地方
歡迎大家一起切磋切磋共同學(xué)習(xí).
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注