C#/.net從業必要技能

C#/.net從業技能(一)

以下是我整理.net從業的必要技能

必要技能

序號 必要技能
1 C#語言相關
2 設計與架構
3 崗位相關
4 數據庫
5 線程
6 語言

C#語言相關

序號 必要技能
1 .net 平臺基礎知識
2 C#類型基礎
3 C#的面向對象
4 內存管理和垃圾回收
5 C#數據結構
6 委託與事件
7 泛型
8 LINQ相關
9 反射
10 C#的新特性

平臺基礎知識

【1】NET Framework 具有兩個主要組件:公共語言運行庫和 .NET Framework 類庫。

  • CLR-Common Language Runtime 意爲公共語⾔運⾏庫,它是⼀個可由多種不同編程語⾔使⽤的運⾏庫,只要是⾯向 CLR 的編譯器編譯的編程語⾔都被 CLR ⽀持。
  • IL-Intermediate Language(IL),意爲中間語⾔,⾯向 CLR 的編程語⾔被編譯爲IL代碼,IL代碼也被稱爲託管代碼,它是與 CPU ⽆關的機器語⾔,是⼀種⾯向對象的機器語⾔。每⼀個 IL代碼⽂件被稱爲託管模塊(managed module)。託管模塊是⼀個32位或是64位可移植執⾏體⽂件,它們需要CLR才能執⾏。每個託管模塊帶有相應的元數據(metadata),元數據描述模塊中定義的內容,⽐如類型及成員、導⼊的類型及成員。每個託管模塊由操作系統頭信息、CLR頭(記錄版本、⼊口⽅法等)、元數據、IL代碼(CLR在運⾏時將IL編譯成本地CPU 指令)。 ⼀個.NET程序集是由⼀個或者多個託管模塊和資源⽂件組成,程序集是⼀個或是多個託管模塊的邏輯分組,是最⼩的可重用、安全性及版本控制單元。
  • JIT-just-in-time(JIT),意爲CLR對IL代碼進⾏即時編譯的過程,CLR擁有進⾏JIT過程的編譯器(JITComiler),它將要調⽤的IL 代碼編譯爲本地 CPU 指令。

【2】引用類型和值類型
CLR⽀持引⽤類型和值類型。 引⽤類型總是從託管堆上分配,C#的new操作符會返回對象的內存地址。結構與枚舉都是值類型,與引⽤類型相⽐,值類型是⼀種輕量級的類型,值類型實例是在線程的堆棧上分配,值類型不需要內存指針,不需要垃圾收集處理。所有類型 都是System.Object派⽣,所有值類型都是由System.ValueType抽象類派⽣。
拆箱是獲取已裝箱對象各個字段的地址(拆箱關鍵),並將已經裝箱的對象的字段值複製到新的值類型變量的字段。拆 箱時只能將對象拆箱爲它裝箱時的類型。
【重要提示】⼿動控制裝箱的速度將⽐編譯器裝箱的速度快。如:

//編譯器裝箱
 Int32 v =5;
 Console.writeLine({0}{1}{2},v,v,v);
 //⼿動裝箱
 Int32 v=5;object o =v;
 Console.writeLine({0}{1}{2},o,o,o)

【3】面向對象的三大特徵五大原則

  • 封裝性
    每個對象都包含它進行操作所需要的所有信息,封裝只公開代碼單元的對外接口,而隱藏其具體實現,儘量不對外公開代碼。
  • 繼承性
    繼承可以使用現有類的所有功能,並在無須重新編寫原來的類的情況下,對這些功能進行擴展。
  • 多態性
    包括方法的重載和重寫。

【4】接口和抽象類的區別和聯繫

  • 接口
    指對協定進行定義的引用類型,其他類型實現接口,以保證它們支持某些操作。接口指定必須由類提供的成員或實現它的其他接口。與類相似,接口可以包含方法、屬性、索引器和事件作爲成員。
    1、接口存在的意義是爲了實現多態;
    2、接口中只能包含方法(屬性、事件、索引);
    3、接口的成員不能有任何實現;
    4、接口不能被實例化;靜態類、抽象類也不可以被實例化;
    5、接口的成員不能有訪問修飾符(默認爲public);
    6、實現接口的子類必須將接口的所有成員函數實現;
    7、子類實現接口的方法時,不需要任何關鍵字,直接實現即可。(抽象類、虛方法需要加override)

  • 抽象類
    在面向對象過程中,所有的對象都是類描繪的,反過來,類裏面的數據不足以把具體的對象描繪出來,這樣的類就是抽象類
    1、抽象方法只能出現在抽象類中,但是抽象類中可以包含普通方法。
    2、在父類中定義的抽象方法不能實現。
    3、抽象類不能實例化(也就是不能new出來)。
    4、抽象類與抽象方法需要添加abstract關鍵字。
    5、子類實現父類的抽象方法時,需要添加override關鍵字。
    6、如果抽象類的子類不是抽象類,那麼子類中必須重寫父類抽象類的所有抽象方法。

  • 相同點
      1.不能實例化;
      2.包含未實現的方法聲明;
      3.派生類必須實現未實現的方法,抽象類是抽象方法,接口則是所有成員(不僅是方法包括其他成員)

  • 不同點
      1.接口可以多繼承,抽象類不能實現多繼承。
      2.接口只能定義抽象規則,抽象類既能定義抽象規則也能提供已實現的成員
      3.接口是一組行爲規範,抽象類是一個不完全的類,着重於族的概念
      4.接口支持回調,抽象類不能實現回調,因爲繼承不支持。
      5.接口只包含方法、屬性、索引器、事件的簽名,但不能定義字段和包含實現的方法,抽象類可以定義屬性、字段、包含有實現的方法
      6.接口可以作用於值類型和引用類型,抽象類只能作用於引用類型(例如:Struct只能繼承接口)
      7.抽象類應主要用於關係密切的對象,而接口則是適合爲不相關的類提供通用功能
      8.接口着重於Can—Do關係類型,抽象類則偏重於IS—A式關係。
      9.接口多定義對象的行爲,抽象類多定義對象的屬性。
      10.如果要設計小而簡練的功能塊,則使用接口,如果要設計大的功能單元,則使用抽象類
      11.接口對應是面向對象編程思想的重要原則:面向接口編程

【5】內存管理和垃圾回收機制
值類型保存在Stack上,隨着函數的執行作用域執行完畢而自動出棧,所以這一類型的資源不是GC所關心 對象。GC垃圾回收主要是是指保存在Heap上的資源。
.NET的GC機制有這樣兩個問題:
  首先,GC並不是能釋放所有的資源。它不能自動釋放非託管資源。
  第二,GC並不是實時性的,這將會造成系統性能上的瓶頸和不確定性。
  GC並不是實時性的,這會造成系統性能上的瓶頸和不確定性。所以有了IDisposable接口,IDisposable接口定義了Dispose方法,這個方法用來供程序員顯式調用以釋放非託管資源。使用using語句可以簡化資源管理。
  託管資源 : 託管資源指的是.NET可以自動進行回收的資源,主要是指託管堆上分配的內存資源。託管資源的回收工作是不需要人工干預的,有.NET運行庫在合適調用垃圾回收器進行回收。
  非託管資源:非託管資源指的是.NET不知道如何回收的資源,最常見的一類非託管資源是包裝操作系統資源的對象,例如文件,窗口,網絡連接,數據庫連接,畫刷,圖標 等。這類資源,垃圾回收器在清理的時候會調用Object.Finalize()方法。默認情況下,方法是空的,對於非託管對象,需要在此方法中編寫回收非託管資源的代碼,以便垃圾回收器正確回收資源。

  • 聲明析構函數作爲類的成員(析構函數沒有返回值,沒有參數,沒有修飾符)【不建議

  • 在類中實現System.IDisposable 接口  在這裏插入圖片描述
    【6】Array、ArrayList、List<T>

  • Array(數組)在內存中是連續存儲的、所以它的索引速度是非常快的、時間複雜度爲O(1)、而且它的賦值/修改/獲取元素也是非常簡單的。

  • ArrayList大小會根據需要動態增加的數組、實現了IList接口、可以方便的對數據進行添加、插入和刪除。ArrayList會把插入的數據都當做object類型來存儲、在操作數據的時候可能會因爲類型不匹配而出現異常、它是非類型安全的對象。由於存儲的是object類型、在使用的時候進行類型轉換、會造成裝箱拆箱、從而損耗性能。

  • 由於泛型List是強類型、編譯器會驗證類型安全。這樣就避免了類型的不安全、以及數據強制轉換導致裝箱拆箱損耗性能。

  • Dictionary 源碼解析 是HashTable的泛型實現。

  • HashTable: 表⽰鍵/值對的集合,這些鍵/值對根據鍵的哈希代碼進⾏組織。

  • Stack:表⽰對象的簡單的後進先出⾮泛型集合。Stack 的容量是 Stack 可以保存的元素數。Stack 的默認初始容量爲 10。 向 Stack 添加元素時,將通過重新分配來根據需要⾃動增⼤容量。Stack常被當作循環緩衝區。

  • Queue(隊列):是表⽰對象的先進先出集合,與Stack相反。隊列在按接收順序存儲消息⽅⾯⾮常有⽤,以便於進⾏順 序處理。此類將隊列作爲循環數組實現。存儲在 Queue 中的對象在⼀端插⼊,從另⼀端移除。Queue 的容量是 Queue 可以保存的元素數。Queue 的默認初始容量爲 32。向 Queue 添加元素時,將通過重新分配來根據 需要⾃動增⼤容量。

【7】新特性及其引入該特性實際意義

  • 委託與事件、反射
    委託是.NET中的回調機制。將一個方法綁定到一個委託時,C#和CLR允許引用類型的協變(covariance)和反協變(contra-variance)。協變是指一個方法能返回一個從委託的返回類型派生出來的類型。反協變是指一個方法的參數類型可以是委託的參數類型的基類。但協變對於返回值類型或void的方法不適用。
    關鍵字“event”是個修飾詞,在絕⼤多數的情形中,被指定爲委託(delegate)的對象和被指定爲事件(event)的對象是可以互換的。然⽽,事件還有特殊之處:
    ● 事件就像⼀個委託類型的字段。該字段引⽤了⼀個代表事件處理器的委託,這些處理器是被添加到事件上的;
    ● 事件只能在聲明它的類中被調⽤,⽽所有能見到委託的地⽅都可以使⽤委託;
    ● 事件可以被包含在接口中⽽委託不可以;
    ● 事件有可被重寫的Add和Remove存取(acccessor)⽅法;
  • 泛型(generic)是CLR與編程語⾔提供的⼀種實現“算法重⽤”的機制。泛型對象設計⽤於管理在類型上成家族的集合。
    1、使用接口方法變爲強類型。
    2、泛型接口在操作值類型時,會減少裝箱操作。
    3、類可以實現同一個接口若干次,只要使用不同的類型參數。
  • LINQ 擴展類型、Lambda表達式、閉包
    語言集成查詢 (LINQ) 是一系列直接將查詢功能集成到 C# 語言的技術統稱,比如涵蓋:SQL 數據庫查詢、XML 文檔查詢、List對象查詢、Array對象查詢、String對象查詢……。 藉助 LINQ,查詢成爲了最高級的語言構造,就像類、方法和事件一樣。
  • 動態語言運行時
  • async/await
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章