重溫C# clr 筆記總結

來源:互聯網
上載者:User

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# 編譯器 只允許介面定義方法,因為 事件,屬性,索引器 本質上都是方法,所以也允許在介面中定義他們。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.