《Essential .Net》讀書筆記 - Chapter 3
2024-07-10 12:56:19
供稿:網友
chapter 3
1. 工作人員劃分了程序集以后,他們大部分時間就用來考慮類型如何工作,如何聯系了。所有的表示類型的構建(類,結構,枚舉等)最終會映射到clr的類型定義上。
2. clr類型(clr type)是命名的可重用抽象體。clr類型的描述存放在clr模塊的元數據中,該模塊還包含是類型工作所需要的cil或者本機代碼。
3. 完全限定的clr類此哪個名包括三個部分:程序集名字、可選的命名空間前綴和類型名稱。
4. 公共類型系統比大多數編程語言所能處理的類型要寬得多。提交給ecma的cli部分被劃分為一個cts子集,它能被所有cli兼容的語言支持。這個子集叫做cls(common language specification,公共語言規范)。組件強烈推薦開發者使用符合cls的規范以增強組件的可訪性功能。cli定義了一個特性system.clscompliant,它指示編譯器對所有公有成員實施cls遵從性檢查。
5. clr類型定義由零個或多個成員(member)組成。類型的每個成員都有自己的訪問修飾符(access modifier)控制對于成員的訪問。按實例訪問(per-instance member)/ 按類型訪問(per-type member,即static/shared等)。
6. cts有三種基本類型的成員:字段、方法和嵌套類型。字段是一個命名的存儲單元,它隸屬于所聲明的類型。方法是一個命名的操作,它可以被調用和執行。嵌套類型則是一種簡單的輔助類型。其他類型成員(屬性、事件)是以附加元數據的形式出現的方法。
7. 類型的字段控制內存如何分配。clr使用類型的字段來決定分配多少內存給這個類型。clr會給static字段分配一次內存(類型首次加載時)。
8. clr每次分配類型實例時,都會為non-static字段分配內存。
9. 在分配內存時,clr初始化static字段并賦予默認值。數值類型默認為零,布爾類型默認為false,引用類型為null。
10. 默認情況下,確切的內存布局是不透明的。clr使用虛擬內存布局,并且會經常重新排序字段以優化訪問和使用。
11. const在編譯時會被內聯進所有使用它的地方(注意這樣做帶來的現象),const字段在初始化值在編譯時必須是已知的;initonly字段clr會在引用處調用它的值,initonly字段只能在聲明時或者構造函數里賦值。
12. clr允許方法為最后一個參數使用[system.paramarrayattribute]特性。
13. 由于編譯器可能有不同的特性,所以盡量使用明確的重載。
14. 嵌套類型往往定義為輔助對象,如迭代器、序列化器。
15. 嵌套類型能防止對命名空間的污染。clr的嵌套類型總是被聲明為靜態成員,它不隸屬于任何特定的實例,嵌套類型的名字有外部類型名字限定。
16. 嵌套類型能做到對聲明類型的私有成員進行無限制訪問。
17. 靜態字段初始化順序:聲明à靜態構造函數(.cctor)。
18. clr將靜態初始化方法的調用延遲到第一個靜態字段被訪問的時候(beforefieldinit特性)。靜態初始化方法在生成這個類的實例之前不一定會被調用。
19. 當基類型和派生類型存在同名的方法時,clr支持兩種基本的策略:按名字隱藏(hide-by-name)和按簽名隱藏(hide-by-signature)。通過在派生類的方法上上添加hidebysig元數據特性與否來確定。c#總是按簽名隱藏的。
20. 強烈推薦不要在一個non-sealed類型的構造函數中調用虛方法,因為派生類的虛方法的部分還沒有執行到,因此可能會導致不可預見的問題
21. 構造派生類時的執行順序:初始化派生類字段à構造基類à調用派生類(“構造基類”是一個遞歸的過程)。
22. 為了保證派生類正確地調用基類的構造函數,可以把基類的構造函數修飾為internal,這樣保證了只有自己寫的程序集才能夠調用該構造函數。
,歡迎訪問網頁設計愛好者web開發。