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方法返回的是儲存在xqmbqctqym指定物件的「型別物件指標」成員中的位址。
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 開發平台的關鍵,它允許程式語言,型別和物件之間無縫整合。
&nwww.cppcns.combsp;
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保證每個應用程式域xqmbqctqym的型別構造器只執行一次,而且是執行緒安全的,所以最適合構造
singleton 模式
57:如果希望應用程式域關閉時能執行某些**,我們可以在system.appdomain的domainunload事件中註冊乙個**方法。
58:當編譯器查詢fcl 中的核心數值(int32,int64)等基元型別的操作符時,會生成直接操作的il指令,所以核心fcl 型別不能定義任何操作符過載方法的原因,因為方法呼叫會影響效率。
59:clr規範將轉換操作符過載方法定義為public 和static 方法。
60:只有方法的最後乙個引數才可以使用params 關鍵字。
61:屬性不能作為out 或re程式設計客棧f 引數傳遞給方法,欄位則可以。因為屬性的本質是getter 和 setter.
62:c# 編譯器 只允許介面定義方法,因為 事件,屬性,索引器 本質上都是方法,所以也允許在介面中定義他們。
本文標題: 重溫c# clr 筆記總結
本文位址:
重溫C primer 之const總結
1.const變數,即常變數 變數值保持不變,不能被修改 a.const變數預設時是定義該變數的檔案的區域性變數 b.非const 指標無法指向const 變數,只有const 指標能指向const 變數。c.一些const 變數定義在標頭檔案中,const變數通過常量表示式自我初始化時.2.a.a...
重溫C primer 之const總結
1.const變數,即常變數 變數值保持不變,不能被修改 a.const變數預設時是定義該變數的檔案的區域性變數 b.非const 指標無法指向const 變數,只有const 指標能指向const 變數。c.一些const 變數定義在標頭檔案中,const變數通過常量表示式自我初始化時.2.a.a...
漏洞重溫之sql注入(總結)
sql注入即是指web應用程式對使用者輸入資料的合法性沒有判斷或過濾不嚴,攻擊者可以在web應用程式中事先定義好的查詢語句的結尾上新增額外的sql語句,在管理員不知情的情況下實現非法操作,以此來實現欺騙資料庫伺服器執行非授權的任意查詢,從而進一步得到相應的資料資訊。一.網頁為了滿足正常使用者檢索所需...