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