零散知識點

1.值類型和引用類型的區別程序員

      1. 值類型的變量賦值時是將真實數據的副本付給變量,而引用類型則是將對象的引用付給變量, 這會產生多個多個變量同時指向一個對象實例
      2. 值類型定義時,會在堆棧上分配內存,引用類型會在堆上分配內存
      3. 全部的值類型都有共同的基類:System.ValueType.全部值類型都已經實現了類容的比較equals() 方法,而引用類型在沒有重寫Equals()方法的狀況下,任然採用引用比較。

2. 堆和棧的區別算法

    1. 棧由操做系統自動分配和釋放,通常用於存放函數的參數和局部變量的值。堆有程序員分配和釋放,若是程序不主動釋放,可在GC進行回收,或在程序結束後由操做系統回收。
    2. 棧使用的是一級緩存,在調用時被分配空間,調用完畢當即釋放;

堆使用的是二級緩存,生命週期由垃圾回收算法來決定。c#

3.結構和類的區別windows

  1. 結構是值類型,類是引用類型 。
  2. 結構裏的成員都是public,類有其餘的訪問限定符
  3. 類是顯示實物的一種抽象,結構包含不一樣類別數據的一種包裝。全部類型只包含一些數據時,用結構比較合適。
  4. 結構不能繼承,類能夠。
  5. Sealed修飾類有什麼特色

Sealed修飾類,表示該類爲密封類。不能從它派生出其它類。全部sealed和abstract不能同時限定類緩存

         6.結構不能定義不帶參數的構造函數,類能夠。由於運行庫會提供隱式構造方法,把值類型初始成0,把引用類型初始成null.即便提供了帶參數的構造函數,也不能繞過默認構造函數;閉包

         7.結構不能直接給字段附默認值;併發

4.  類的訪問限定符異步

        Partial: 類分紅兩個文件,分別在不一樣的文件中ide

       Public : 該類的訪問不受限制。函數

       Internal:同一個assembly的文件間的纔可引用,常見的用途是基於組件的開發。

成員的訪問限定符

  Public:訪問不受限制

  Private:只能在本類中訪問

  Protected:在本類或其子類中能夠訪問

  Internal:同一程序集中

六、面向對象的3個基本特徵

  1. 封裝:把客觀的事物封裝成抽象的類,類能夠吧本身的數據和方法公開給可信的類或對象進行使用,對不可信的進行信息隱藏;
  2. 繼承:
  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;
}
}
View Code

 

8. 抽象類和接口

相同點: 

       1.都不能被實例化;

       2.都包含的未實現的方法;

      3. 派生類必需要實現未實現的方法,接口是全部定義的方法,抽象類是未定義的方法;

       4.他們都是實現擴展的一個手段。

不一樣點:

      1.抽象類是對類的不可變行爲的抽象,這些修爲能夠在抽象類中定義和實現。接口是定義的一組行爲規範,不能有實現和私有字段。

       2.一個類能夠實現多個接口,但只能擴展一個父類。

      3.接口不具有繼承的任何特色,只承諾能被調用的方法。

       4.若是抽象類實現接口,能夠將接口的方法映射到抽象方法而沒必要實現,讓子類去實現。 

   抽象類和接口的使用: 

     1.儘可能避免使用繼承來實現組建功能,而是用黑箱複用,即對象組合(把另外一個類的對象組合到類中來實現功能組合);

    2.接口污染:接口應具有專注功能性,而不是多功能的;

    3.oop原則:把可變的和不可變的分離;抽象類和接口都是定義不可變的。

     4.若是建立的功能是在大範圍的全異對象間使用,則使用接口;

    5.若是要設計大的功能單元,則用抽象類,若是在全部實現間提供通用的功能實現,則用接口。

    6.抽象類主要用於關係密切的對象; 接口用於爲不相關的類提供通用功能;

9.類的設計原則

  1. 開閉原則:在擴展方面開放,在修改方面封閉。多用接口、抽象類、多態等技術來設計。

         實現方法:把不變的部分抽象成接口;

         接口要注意最小功能實現;

         模塊之間的調用要經過接口進行,這樣即便實現層發生變化,也無需修改調用層的代碼;   

 

  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表達是能夠訪問表達式塊外部的變量;

相關文章
相關標籤/搜索