本以為可以有點(diǎn)時(shí)間來(lái)好好學(xué)習(xí)一下MFC,可是昨天和supervisor見(jiàn)了個(gè)面,發(fā)現(xiàn)必須要馬上學(xué)習(xí)C#才行。之前聽(tīng)說(shuō)C# = C++ + Java,花了兩天時(shí)間看了c#的基本語(yǔ)法,發(fā)現(xiàn)果然如此,基本語(yǔ)法和c++沒(méi)什么區(qū)別,代碼結(jié)構(gòu)上又是繼承了Java(比如沒(méi)有頭文件,main()也放在了class里面等)。我看的是《Programming C# 3 0》 5th Edition,這書(shū)寫(xiě)得不錯(cuò),不知道第五版有沒(méi)有中文版(反正我搜索只有第四版的中文版),作者不愧是微軟的人,開(kāi)篇就把c#一頓吹,吹得讓我這種剛學(xué)c#的人信心爆棚,覺(jué)得c#似乎無(wú)所不能,可以勝任各種平臺(tái),包辦本地和web應(yīng)用。哦,他推崇應(yīng)該是.NET,不過(guò)既然c#是.NET的御用語(yǔ)言,當(dāng)然也該推崇了。話說(shuō)回來(lái),Jesse的語(yǔ)言能力和寫(xiě)作水平還是毋庸置疑的,讀起來(lái)還是十分輕松的(不像某Bruce),這可能也和本書(shū)定位有關(guān)(Beginning to Intermediate)。
寫(xiě)下幾點(diǎn)個(gè)人覺(jué)得要記住的地方(或者說(shuō)是比起c++有變化的地方):
1.用于if等語(yǔ)句的條件判斷的表達(dá)式值只能為bool,不能像C++那樣輸入個(gè)int值進(jìn)行判斷了。這樣也帶來(lái)一個(gè)好處,就是像if(test = 20)這樣的語(yǔ)句就無(wú)法通過(guò)編譯了。相信把“==”寫(xiě)成“=”,每個(gè)人都基本干過(guò)吧,當(dāng)然,你可以寫(xiě)成if(20 == test)來(lái)避免錯(cuò)誤。不過(guò),看來(lái)微軟是不喜歡這樣的,畢竟總是倒著寫(xiě)不符合直覺(jué)啊。
2.switch語(yǔ)句中的每個(gè)非空case必須有顯式的跳轉(zhuǎn),否則程序不會(huì)自動(dòng)進(jìn)入到下一個(gè)case判斷,而是編譯錯(cuò)誤。
3.當(dāng)為class創(chuàng)建對(duì)象時(shí),所有數(shù)據(jù)成員首先會(huì)被初始化為‘0’(或者null等),然后才是調(diào)用構(gòu)造函數(shù)進(jìn)行初始化。也就是說(shuō),在創(chuàng)建一個(gè)對(duì)象時(shí),實(shí)際上數(shù)據(jù)成員被賦了兩次值。我不知道為什么要設(shè)計(jì)成這樣,也不知道作者提出這一點(diǎn)目的何在,因?yàn)檎{(diào)用構(gòu)造函數(shù)之前的事情似乎完全是不受我們控制的。
4.構(gòu)造函數(shù)要聲明為public
5.this是一個(gè)引用而不是指針,不過(guò)就我目前的水平來(lái)看,實(shí)際上使用仍然是一回事。
6.靜態(tài)成員只能通過(guò)類(lèi)名來(lái)訪問(wèn),若試圖通過(guò)實(shí)例訪問(wèn)就會(huì)編譯錯(cuò)誤。
7.傳遞參數(shù)為引用時(shí)使用ref。比如function(int& inNumber),應(yīng)該寫(xiě)成function(ref int inNumber)。并且在調(diào)用該函數(shù)是必須顯式地指明:function(ref aNumber)。另一個(gè)修飾符out也能實(shí)現(xiàn)同樣的功能,目前知道的區(qū)別就是:在用out傳入的參數(shù)不要求有初始化值,不過(guò)必須在函數(shù)中給它賦值,否則就報(bào)錯(cuò),而ref則不是必需要求被賦值。(網(wǎng)上搜了下,有這么一句:“Out更適合用在需要Return多個(gè)返回值的地方,而Ref則用在需要被調(diào)用的方法修改調(diào)用者的引用的時(shí)候”,先放在這)
8.不需要析構(gòu)函數(shù),因?yàn)橛蠫C。不過(guò),當(dāng)你想自己處理非托管資源(unmanaged resources)時(shí),還是需要的。不過(guò)你可以使用某些已經(jīng)包裝好的類(lèi)(wrapper classes)來(lái)避免這種情況(大概是這么個(gè)意思吧,作者提到了FileStream,讓我不禁想到Java里的FileStream)。
9.修飾符:readonly和const有些類(lèi)似,通過(guò)博客園和csdn上的一些文章,大概記住的區(qū)別有:readonly不要求是static的;只能用于類(lèi)的數(shù)據(jù)成員;只能用構(gòu)造函數(shù)來(lái)初始化(在聲明時(shí)的賦值沒(méi)有意義)。放兩篇文章以便以后學(xué)習(xí):Kenney的《比較C#中的readonly與const》和Allen Lee的《readonly vs. const [C#]》。readonly可以用來(lái)聲明那些在運(yùn)行時(shí)才能確定的常量。
以上,基本就是看《Programming C# 3 0》一部前4章的一些記錄。