1.值類型和引用類型的區別程序員
2. 堆和棧的區別算法
堆使用的是二級緩存,生命週期由垃圾回收算法來決定。c#
3.結構和類的區別windows
Sealed修飾類,表示該類爲密封類。不能從它派生出其它類。全部sealed和abstract不能同時限定類緩存
6.結構不能定義不帶參數的構造函數,類能夠。由於運行庫會提供隱式構造方法,把值類型初始成0,把引用類型初始成null.即便提供了帶參數的構造函數,也不能繞過默認構造函數;閉包
7.結構不能直接給字段附默認值;併發
4. 類的訪問限定符異步
Partial: 類分紅兩個文件,分別在不一樣的文件中ide
Public : 該類的訪問不受限制。函數
Internal:同一個assembly的文件間的纔可引用,常見的用途是基於組件的開發。
成員的訪問限定符
Public:訪問不受限制
Private:只能在本類中訪問
Protected:在本類或其子類中能夠訪問
Internal:同一程序集中
六、面向對象的3個基本特徵
7.。net託管資源與非託管資源
託管資源:就是由clr分配和釋放 的資源,有兩種類型,一是普通託管,如int,float等值類型對象;二是非普通託管資源,繼承了IDISPOSE接口在類的實例對象。此類資源在被GC回收時要經歷兩步,會下降系統性能,所以在實現dispose方法時要注意手動清理。
非委託資源:就是不受clr管理的對象。如windows內核對象,File,dbConnection,Socket,com對象等。
繼承Idispose接口的類的對象不是非委託 資源,非委託資源沒法在程序中自定義。
若是在程序中使用到了非委託資源就要在程序中顯示地釋放資源,方法是讓類型繼承Idispose接口,
//自定義非普通託管資源 Class MyResource:IDispose { Public void Dispose(){} } Public class SampleClass :IDispose { //非普通託管資源 MyResource myResource=new MyResource(); //非委託資源 Private IntPtr nativeResource=Marshal.AllocHGlobal(100); //普通委託資源 Private String name=」bany」; Private bool disposed=false; Public void Dispose() { //必須爲true,顯示釋放全部資 源 Dispose(true); //通知垃圾回收機制再也不調用終結器(析構器),也就是GC再也不調用 ~SampleClass() GC.SuppressFinalize(this); } //防止程序員顯示調用dispose()來回收資源,這時可由GC來回收並釋放非託管資源。 //析構函數中不容許釋放託管資源,由於Gc在調用析構函數前可能已經釋放非託管資源 ~SampleClass() { //必須爲false Dispose(false); } //若是子類繼承並實現了本身的dispose方法,必須調用父類的dispose() 來釋放父類中的資源。調用 base.Dispose(disposing); Protected virtual void Dispose(bool disposing) { If(disposed) return ; If(disposing) { //清理非普通類型的託管資源 If(nyResource!=null) { myResource.Dispose(); myResource=null; } } //清理非託管資源 If(nativeResource!=IntPtr.Zero) { Marshal.FreeHGlobal(nativeResource); nativeResource=IntPtr.Zero; } Disposed=true; } }
8. 抽象類和接口
相同點:
1.都不能被實例化;
2.都包含的未實現的方法;
3. 派生類必需要實現未實現的方法,接口是全部定義的方法,抽象類是未定義的方法;
4.他們都是實現擴展的一個手段。
不一樣點:
1.抽象類是對類的不可變行爲的抽象,這些修爲能夠在抽象類中定義和實現。接口是定義的一組行爲規範,不能有實現和私有字段。
2.一個類能夠實現多個接口,但只能擴展一個父類。
3.接口不具有繼承的任何特色,只承諾能被調用的方法。
4.若是抽象類實現接口,能夠將接口的方法映射到抽象方法而沒必要實現,讓子類去實現。
抽象類和接口的使用:
1.儘可能避免使用繼承來實現組建功能,而是用黑箱複用,即對象組合(把另外一個類的對象組合到類中來實現功能組合);
2.接口污染:接口應具有專注功能性,而不是多功能的;
3.oop原則:把可變的和不可變的分離;抽象類和接口都是定義不可變的。
4.若是建立的功能是在大範圍的全異對象間使用,則使用接口;
5.若是要設計大的功能單元,則用抽象類,若是在全部實現間提供通用的功能實現,則用接口。
6.抽象類主要用於關係密切的對象; 接口用於爲不相關的類提供通用功能;
9.類的設計原則
實現方法:把不變的部分抽象成接口;
接口要注意最小功能實現;
模塊之間的調用要經過接口進行,這樣即便實現層發生變化,也無需修改調用層的代碼;
2.替換原則:子類能夠替換父類,並出如今父類出現的任何地方。
3.依賴原則:依賴關係儘可能依賴接口和抽象類。具體類只負責業務實現,修改具體類不會影響整個業務的依賴關係。
高層模塊不該該依賴於低層模塊,兩者都應該依賴於抽象。
抽象不該該依賴於細節,細節應該依賴於抽象
4. 接口分離原則:使用多個專門的接口要比使用單一接口涵蓋多個功能好。
5.單一職責:類在。一個操做類只完成一種職責。
設計時如何劃分職責:可分爲實體類,操做類,邊界類;
一種職責:引發該類發生變化的一個緣由;
操做類:控制類有效將業務邏輯獨立於實體數據和邊界控制,專一於處理業務邏輯,控制類會將特有的操做和實體類分離,者有利於實體類的統一化和提升複用性。
10. 靜態類和靜態構造函數
靜態類:該類包含的全部屬性和方法都是靜態的,該類就是靜態類,不能建立靜態類的實例,因此不存在構造函數。使用靜態類能夠檢查用戶是否不經意的建立的類 的實例。在功能上與使用私有靜態構造函數建立的類相同。
構造函數:1.編譯器會給沒有定義構造函數的類建立默認的不帶參數的構造函數,它只能把全部的字段成員初始化爲標準的默認值。
2.若是類已提供了帶參數的構造函數,編譯器就會不自動提供默認的構造函數。
3.能夠把構造函數定義爲private /protected ,這樣就不能在外部實例化該類,這樣不相關的類就不能訪問她了。
靜態構造函數:類有一些靜態的字段或屬性,須要在第一次使用類以前,在外部源中初始化這些靜態字段和屬性。
1.靜態構造函數沒有訪問限制符,其它c#代碼不會調用它,它只是在第一次調用類的任何成員以前會執行它。
2.靜態構造函數不能有任何參數,一個類只能定義一個靜態構造函數。
11.擴展方法
1.一個類沒有的源代碼,須要給類添加方法。
2.擴展方法是個靜態方法,需定義在靜態類中。第一個參數是要擴展的類型,用this關鍵字修飾。
12 . 接口繼承和實現繼承:只繼承接口的函數簽名,後者還繼承方法實現。
虛方法:(virtual)能夠在如何派生類中重寫該方法。
13.派生類的構造函數
14.泛型類型
默認值:因爲不能把null 賦值給泛型類型,在給泛型類型賦默認值是用default 如: T doc=default(T);
15:委託
委託是實現對方法的引用,能夠把方法當參數,進行傳遞。主要應用場景是實現對同步方法的異步調用(invoke,beginInvoke,endInvoke),也實現對控件的異步或併發訪問。它是經過使用線程池中的線程來進行異步調用。
2.多播委託包含一個逐個調用的委託集合,若是經過委託調用的其中一個方法出現異常,整個迭代就會終止。爲解決這個問題,委託添加了GetInvocationList()方法,用來遍歷委託對象列表。
3.匿名方法:不用單獨定義僅有委託引用的方法;匿名方法中不能包含跳轉語句(break, goto,continue)跳轉到匿名方法的外部,反之,匿名方法外部的跳轉語句不能跳轉到匿名方法內部;不能訪問在匿名方法外部使用的ref和out參數。
4.lambda表達式。c#3.0用來替代匿名方法,給委託賦予實現代碼。lambda運算符=> ,左邊爲參數列表,右側爲實現代碼;
5.閉包:經過lambda表達是能夠訪問表達式塊外部的變量;