掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
據(jù)Marek Safar稱,通過(guò)使用一種名為類型推斷(type inference)的技術(shù),Mono C#編譯器現(xiàn)在已經(jīng)能夠支持隱式類型的局部變量以及隱式類型的數(shù)組了。

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

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流