《C#圖解教程》讀書心得之C#語(yǔ)言
這本書講解C#語(yǔ)言十分詳細(xì),我將其中的重要內(nèi)容整理成條款,以備忘。
1..NET 由三部分組成:CLR ,編碼工具和 BCL 。CLR 負(fù)責(zé)內(nèi)存管理、代碼安全驗(yàn)證、代碼執(zhí)行、垃圾收集。.NET 提供平臺(tái)調(diào)用( P/Invoke ), 允許調(diào)用 Windows API ,而且還可以和 COM 進(jìn)行交互操作。
2. .NET 開發(fā)人員可以不必了解 COM 的知識(shí),無(wú)需考慮諸如 IUnknown 接口,類型庫(kù),引用計(jì)數(shù),注冊(cè)表以及 HRESULT(COM 使用 HRESULT) 數(shù)據(jù)類型返回運(yùn)行時(shí)錯(cuò)誤代碼,而 .NET 不使用 HRESULT ,因?yàn)樗械倪\(yùn)行時(shí)錯(cuò)誤都會(huì)產(chǎn)生異常。
3. .NET 語(yǔ)言的編譯器接受源代碼文件,輸出文件為程序集。程序集中的代碼并不是本地代碼,而是CIL 。程序集中包含CIL ,程序集中使用的類型的元數(shù)據(jù)以及對(duì)其他程序集引用的元數(shù)據(jù)。
4. CLR 在運(yùn)行時(shí)首先檢查程序集的安全特性,然后在內(nèi)存中分配空間,再把程序集中被調(diào)用到的 代碼送進(jìn) JIT 。程序集中的 CIL 只有在被調(diào)用到時(shí)才會(huì)被 JIT 編譯成本地代碼,然后就被緩存起來(lái)以備在后來(lái)的程序中執(zhí)行,即不被調(diào)用的代碼不會(huì)被編譯成本地代碼,而且被調(diào)用到的代碼只被編譯一次。一旦CIL 被編譯成本地代碼,CLR 就會(huì)在運(yùn)行時(shí)進(jìn)行管理,如:釋放內(nèi)存、檢查數(shù)組邊界、檢查參數(shù)類型、管理異常等。
5.運(yùn)行在CLR ,并且在運(yùn)行時(shí)受CLR 控制的代碼叫做托管代碼,反之為非托管代碼。
6. CLI( 公共語(yǔ)言基礎(chǔ)結(jié)構(gòu) ) 是一組闡述了系統(tǒng)的架構(gòu)、規(guī)則和約定的規(guī)范。包含 CTS: 定義了一組豐富的內(nèi)置類型,定義了每種類型確定的詳細(xì)的特性 , 而且所有支持 .NET 的語(yǔ)言提供的類型通常會(huì)映射到 CTS 中已定義的內(nèi)置類型集的某一個(gè)特殊子集;CLS :詳細(xì)說(shuō)明了支持 .NET 語(yǔ)言的規(guī)則、屬性和行為,其主題包括數(shù)據(jù)類型、類結(jié)構(gòu)和參數(shù)傳遞。
7. 任何以 .NET 平臺(tái)作為目標(biāo)的語(yǔ)言必須建立它的數(shù)據(jù)類型與CTS 的類型間的映射。所有 .NET 語(yǔ)言共享這一類型系統(tǒng),實(shí)現(xiàn)他們之間無(wú)縫的互操作,這個(gè)方案提供了語(yǔ)言之間的繼承性。
8. 由于CLS 是CTS 的子集 , 這意味著一種語(yǔ)言特征可能符合CTS 標(biāo)準(zhǔn),但卻超過(guò)了CLS 的規(guī)范,如:C#語(yǔ)言支持無(wú)符號(hào)數(shù)字類型,該特征能通過(guò) CTS 測(cè)試,但 CLS 卻僅僅識(shí)別有符號(hào)數(shù)字類型。因此,如果用戶在一個(gè)組件類使用 C# 的無(wú)符號(hào)類型,就可能無(wú)法與不支持無(wú)符號(hào)類型的語(yǔ)言(如 VB.NET )設(shè)計(jì)的組件實(shí)現(xiàn)互操作,但并非不可能,實(shí)際上,用戶能夠安全實(shí)現(xiàn)含有 private 成員的組件,CLS 兼容性問(wèn)題。但如果用戶需要 .NET 語(yǔ)言的互操作性,那么用戶的組件中的 public 成員必須完全符合 CLS 規(guī)范。
9. @ 字符只能放在標(biāo)識(shí)符的首位,標(biāo)識(shí)符的命名風(fēng)格有兩種:Pascal 風(fēng)格,如:CarDeck ,建議用于類型名和成員名;Camel 風(fēng)格,如:totalCycleCount ,建議用于本地變量和方法參數(shù)。
10.兩個(gè)公共約定:字段名稱使用下劃線開頭:example 或使用 m_ 開頭: m_example 。
11. 在C#語(yǔ)言中,可以使用任意的占位符和任意數(shù)量的值,值可以以任何順序使用,值可以在格式字符串中替換任意次。例如: Console.WriteLine(”Three integers are {1}, {0}, {1}.”, 3, 6); 輸出為 Three integers are 6, 3,6.
12. 占位符不能引用值列表以外位置的值,如果這樣做了,不會(huì)產(chǎn)生編譯錯(cuò)誤,但會(huì)產(chǎn)生運(yùn)行時(shí)錯(cuò)誤 ( 異常 ) 。
【編輯推薦】