1: .net framework 由兩個部分組成:CLR 和 FCL。
2:在CLR中,所有錯誤都是通過異常來報告的。
3:智能感知功能主要是靠解析元數據實現的。
4:允許在不同語言之間方便的切換,並對各種語言進行緊密集成是CLR的出色特性。
5:一個方法只有在首次運行時才會由於jit造成一定的性能損失,以后對該方法的調用都以本地代碼的形式全速運行。
6:方法簽名指定了參數的數量(及其順序),參數的類型;方法是否有返回值,如果有返回值,還要指定返回值的類型。
7:無論使用哪一種語言,類型的行為是完全一致的,因為類型的行為最終由CLR的CTS來定義。
8:使用[assembly:CLSCompliant(true)] 來檢查CLS的相容性。
9:在同一程序集中,類型默認是internal,有一個原則是微軟總是選擇公開程度最低的關鍵字,比如默認的private。
10:在CLR中一個類型的每個成員要么是一個字段,要么是一個方法。
11:應答文件csc.rsp 的作用,使用/noconfig 開關忽略局部和全局csc.rsp.
12:元數據:二進制數據塊,由幾張表構成:分為3類:a:定義表,b:清單表,c:引用表。
13:一個托管的PE文件由4個部分構成,PE32(+)頭,CLR頭,元數據,IL。
14:程序集是一個或多個類型定義文件及資源文件的集合。
15:程序集允許我們分離可重用類型的邏輯和物理表示,如果一個程序集沒有用到,那么它將永遠不會下載。
16:為了生成一個新的程序集,來自一個引用程序集的所有文件都必須存在,但運行一個應用程序時,引用的程序集的所有文件不一定要全部存在。
17:程序集的版本號格式:主版本號,副版本號,Build號,Revision號。
18:[assembly:AssemblyCulture(“de-ch”)] 將程序集的語言文化設置為瑞士德語。
19:使用msi文件可以實現“即需安裝”。
20:弱命名程序集之所有會成為問題,是因為幾個不同的程序集可能具有相同的弱名稱。
21:“Dll Hell” 根源:共享的Dll全部被復制到System32 目錄中,弱命名的名稱可能相同,最后安裝的會覆蓋前面的程序集。
22:之所以能將程序集拖放進GAC 依靠的是windows explorer shell (擴展) shFusion.dll.
23:在命令窗口cmd下,進入gac目錄 查看gac的結構。
24:在安裝.net framework 時,會安裝兩套副本,一套編譯器/CLR目錄,另一套:GAC 子目錄。
25:ToString 方法默認反悔this.GetType().FullName.
26:GetType方法是非虛方法,這樣就可以防止一個類重寫該方法,隱瞞其類型,破壞安全性。
27:命名空間和程序集沒什么關系。
28:堆上的所有對象都包含兩個額外的成員:類型對象指針和同步塊索引。
29:System.Object 的GetType方法返回的是存儲在指定對象的“類型對象指針”成員中的地址。
30:GetType方法返回的是指向對象的類型對象的一個指針。
31:編譯器直接支持的任何數據類型稱為基元類型。
32:在代表值類型實例的一個變量中,並不包含一個指向實例的指針,相反變量中包含實例本身的字段。
33:文檔將所有值類型都稱為一個結構 或一個枚舉。
34:假如知道自己寫的代碼會造成編譯器反復對一個值類型進行裝箱,那么換用手動方式對值類型進行裝箱,代碼會更小更快。
35:總結第34條:降低調用浪費資源耗費時間多的步驟的次數。
36:使用接口的方式可以允許我們更改一個已裝箱對象的字段,在C#中,不使用接口的方法是達到這個目的的。因為這個方式有點繞,所以不推薦使用需要修改字段的值類型,在設計模式中,值類型是不變的類型。
37:在內部,ValueType的Equals 方法使用反射技術來完成字段的比較,因為反射比較慢,所以在定義自己的值類型時,應重寫Equals方法,不要調用base.Equals.具體的重寫步驟如下:
a:如果obj == null –> false;
b: 參數引用不同對象 -> false;
c:每個字段都相等 –>check ->不相等(false)
d:true.
因為正確的重寫Equals 方法比較復雜,在性能要求不是很嚴重的地方,可以不重寫。
38:在需要修改一個哈希表的健值對時,正確的做法是 先移除再添加。
39:不要對哈希碼 進行持久化 ,因為哈希碼很容易改變,例如一個未來的版本可能使用一個不同的算法來計算對象的哈希碼。
40:元數據的格式與源代碼所使用的編程語言無關,因此元數據的格式都是相同的,元數據是所有語言都可以生成和使用的公共信息,是.net framework 開發平台的關鍵,它允許編程語言,類型和對象之間無縫集成。
41:對於任何可訪問的成員,都必須定義在一個可見的類型內。
PS:類如果都看不到,你還能看到類里面的東西嗎?
42:類型的可見性:public internal(默認)
成員的可見性:public protected private (默認)
43:CLR要求接口的所有成員都是公開的, 接口是個契約,是個合同,所以成員都公開才有意義。
44:C# 編譯器要求原始成員和重寫成員必須具有相同的可訪問性,CLR 允許成員的可訪問性約束更低,而不允許更高。如果父類的某個方法是protected,那么子類重寫這個方法的時候,可以選擇約束更低的
public ,但是不能選擇約束更強的private。
44:關鍵字 static 僅僅可以應用於類,不能應用於值類型(結構,枚舉),因為值類型必須實例化,並且沒有辦法停止和阻止該過程。
45:靜態類必須直接繼承 System.Object ,因為繼承性僅僅適用於對象。
46:靜態類不能實現任何接口,因為只有使用類的實例才能調用接口的方法,可是靜態類不能實例化。
47:只能定義靜態成員,因為靜態類不能實例化。
48:編譯器不會在靜態類 類型中生成實例構造器方法。
49:C# 編譯器 完全支持部分類(partial type) 特征,但是CLR 卻完全不支持,甚至CLR根本就沒有
partial關鍵字。
50:對於類型字段:CLR 會在首次引用類型時才創建動態內存,也即jit 編譯。
對於實例字段,創建類型實例時才分配存放字段的動態內存。
51:如果一個字段屬於引用類型,並且被標記為readonly ,不可改變的是這個引用本身,而不是它所引用的對象。
52:構造器是允許將類型實例初始化為有效狀態的特殊方法。
53:如果有多個實例構造器,最好通過this關鍵字先調用默認無參構造函數,然后再賦值。
public SomeType(int x,int y):this(){}
54:所有值類型的構造器必須初始化值類型的所有字段,因為值類型的任何字段必須在讀取之前進行初始化。
55:類型構造器 最多只有一個,並且永遠沒有參數。
56:因為CLR保證每個應用程序域的類型構造器只執行一次,而且是線程安全的,所以最適合構造
singleton 模式
57:如果希望應用程序域關閉時能執行某些代碼,我們可以在System.AppDomain的DomainUnload事件中注冊一個回調方法。
58:當編譯器查找FCL 中的核心數值(Int32,Int64)等基元類型的操作符時,會生成直接操作的IL指令,所以核心FCL 類型不能定義任何操作符重載方法的原因,因為方法調用會影響效率。
59:CLR規范將轉換操作符重載方法定義為public 和static 方法。
60:只有方法的最后一個參數才可以使用params 關鍵字。
61:屬性不能作為out 或ref 參數傳遞給方法,字段則可以。因為屬性的本質是getter 和 setter.
62:C# 編譯器 只允許接口定義方法,因為 事件,屬性,索引器 本質上都是方法,所以也允許在接口中定義他們。