国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

常被人誤解的基礎(chǔ)知識(shí)(一)C#

2019-11-17 02:16:36
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

常被人誤解的基礎(chǔ)知識(shí)(一)C#

  • 對(duì)值類(lèi)型和引用類(lèi)型的誤解(引用類(lèi)型存儲(chǔ)在堆上,值類(lèi)型存儲(chǔ)在棧上)

在學(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ō)明了.

  • Var是動(dòng)態(tài)類(lèi)型嗎?

這個(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í).


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 古丈县| 邳州市| 巴彦县| 琼中| 虹口区| 隆尧县| 彰化市| 喀什市| 海林市| 阿克陶县| 麻阳| 台南县| 武邑县| 昌乐县| 于都县| 元氏县| 新田县| 道真| 天津市| 东山县| 西丰县| 浦东新区| 濮阳市| 木兰县| 连山| 湘西| 太湖县| 邵阳市| 邵阳县| 东光县| 鄂温| 同德县| 普定县| 城固县| 铁岭县| 大竹县| 繁峙县| 漯河市| 金寨县| 南皮县| 定南县|