新聞中心
據(jù)Marek Safar稱(chēng),通過(guò)使用一種名為類(lèi)型推斷(type inference)的技術(shù),Mono C#編譯器現(xiàn)在已經(jīng)能夠支持隱式類(lèi)型的局部變量以及隱式類(lèi)型的數(shù)組了。

在“類(lèi)C”的語(yǔ)言,比如C#中,我們經(jīng)常使用類(lèi)似“type variable = new type”這樣略顯冗余的辦法來(lái)創(chuàng)建一個(gè)對(duì)象。若是變量的類(lèi)型名稱(chēng)較長(zhǎng),或是會(huì)經(jīng)常變化,那么這樣的聲明方法更是將顯得非常乏味。
借助于***引入的“var”關(guān)鍵字,C# 3.0大大減小了這類(lèi)冗余。通過(guò)這樣的聲明方式,開(kāi)發(fā)者即可在得到動(dòng)態(tài)創(chuàng)建類(lèi)型便利的同時(shí),也無(wú)須犧牲原有的靜態(tài)類(lèi)型支持。編譯器將通過(guò)等號(hào)右面的類(lèi)型信息來(lái)確定變量的實(shí)際類(lèi)型。
需要注意的一點(diǎn)是,C#仍舊是早期綁定和靜態(tài)類(lèi)型的。類(lèi)似Visual Basic這類(lèi)延遲綁定(late binding)語(yǔ)言中的一些常見(jiàn)問(wèn)題(比如由拼寫(xiě)錯(cuò)誤造成的“missing method exception”)并不會(huì)在C#中出現(xiàn)。
雖然看上去不錯(cuò),不過(guò)添加類(lèi)型推斷卻不只是為了提高開(kāi)發(fā)者的那么一點(diǎn)點(diǎn)輸入速度。類(lèi)型推斷是實(shí)現(xiàn)匿名類(lèi)的一個(gè)必要的前提條件,而匿名類(lèi)則在LINQ中被廣 泛使用。因?yàn)槟涿?lèi)并沒(méi)有一個(gè)指定的類(lèi)型名稱(chēng),所以若是沒(méi)有了類(lèi)型推斷的支持,我們就無(wú)法在C#中創(chuàng)建該類(lèi)型的實(shí)例。(VB則是通過(guò)延遲綁定來(lái)實(shí)現(xiàn)的這個(gè) 功能,不過(guò)這也帶來(lái)了“missing method exception”之類(lèi)的問(wèn)題。)
C#中支持兩種類(lèi)型推斷:隱式類(lèi)型變量和隱式類(lèi)型數(shù)組。二者的實(shí)現(xiàn)基礎(chǔ)完全相同,即在編譯時(shí)將“var”替換成為分析得到的正確的變量或數(shù)組類(lèi)型表達(dá)式。
若是變量的聲明和賦值不在同一行書(shū)寫(xiě)的話,編譯器將不允許我們使用類(lèi)型推斷。雖然從技術(shù)角度上考慮,實(shí)現(xiàn)這個(gè)功能沒(méi)有什么困難,不過(guò)Mono C#編譯器的開(kāi)發(fā)團(tuán)隊(duì)可能是為了避免其帶來(lái)的復(fù)雜性,所以并沒(méi)有考慮支持這個(gè)功能。
Marek Safar還提到了兩個(gè)無(wú)法應(yīng)用類(lèi)型推斷的場(chǎng)景。
故名思意,“隱式類(lèi)型局部變量”將無(wú)法用于域變量或常量的聲明中,否則將導(dǎo)致編譯錯(cuò)誤。
我無(wú)法確定為什么會(huì)設(shè)置這樣的限制,或許我有些地方考慮得也不夠全面。
注意:從技術(shù)角度考慮,匿名類(lèi)也擁有類(lèi)型名稱(chēng),該類(lèi)型名稱(chēng)是由Mono C#編譯器自動(dòng)生成的。不過(guò)匿名類(lèi)的名稱(chēng)卻無(wú)法預(yù)料,因此我們只需要考慮其實(shí)現(xiàn)細(xì)節(jié)。換句話說(shuō),我們***將匿名類(lèi)的名稱(chēng)當(dāng)作根本不存在。
網(wǎng)頁(yè)名稱(chēng):介紹MonoC#編譯器
文章路徑:http://m.5511xx.com/article/dpeiohe.html


咨詢
建站咨詢
