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