.Net的基礎概念

  • 1,參數傳遞.

默認都是按值傳遞(不管引用仍是值類型),也就意味着傳遞參數的一個副本給方法.以後在方法體內對參數的更改,對原始參數沒有影響.數據庫

使用ref/out能夠按引用傳遞,直接影響原始參數變量.二者的區別是ref參數必須在傳遞以前進行初始化.在異步方法和迭代器方法中,不能使用它.設計模式

2,CTS,CLS數組

CTS是一個集合,符合它的規範的類型才能在CLR上運行.CLS是它的子集,由於C#中有的類型,在VB中可能沒有(ulong).安全

默認不會進行CLS的檢查,[assembly:System.CLSCompliant(true)]能夠進行檢查.網絡

不符合CLS的代碼,在不一樣語言間會出現複用的問題.app

3,CLR框架

編譯階段,生成的是CIL組成的中間語言,而後在運行時由個平臺的JIT來編譯成機器指令進行運行,因此可以跨平臺.異步

做用:1)管理內存(處理對象佈局,管理對象引用,自動GC),2)線程執行,3)代碼執行(可與非託管代碼互操做,引用COM DLL),4)代碼安全驗證(取決於組件的來源)(以CTS驗證Type),5)編譯(CLR從不解釋託管代碼,由JIT編譯代碼),其可由高性能Server App承載並用託管代碼編寫邏輯.分佈式

4,GCide

0代是新建立的對象,1代是經歷過1次GC後留存的,2代是經歷過1次以上GC留存的.回收時,先從0代開始.

5,is/as

  • is.若是被判斷對象是null,那麼返回false.
  • as.若是類型不兼容,那麼返回null.
  • 二者都不會拋出異常.可是as更加高效.

6,接口/抽象類

  • 接口.不能含有Field和靜態成員.能夠做用於引用和值類型.
  • 抽象類.不能被new,不能sealed.實現其方法是用overriding.
  • "接口不變".當新增功能時,不能修改舊接口,而應該添加新的接口.接口應該設計爲單一功能.
  • 當組件要被設計爲多個版本時,是用抽象類.
  • 當功能要被使用在大範圍的全異對象上時,使用接口.抽象類用於關係緊密的對象組.
  • 接口更適合於小而簡練的功能.而抽象類能夠有默認的實現.
  • 對於一個繼承了多個接口的類,而多個接口中含有相同簽名的方法,只須要實現一次便可.當須要分別實現時,必須顯示指定,而且調用時須要類型轉換.

7,Attribute特性

  • 本質上是Class,爲目標元素提供關聯附加信息.在運行時經過反射來獲取該附加信息,來動態改變代碼的執行方式.
  • 主要用於序列化,編譯器指令,設計模式上.
  • 其實例在編譯時初始化.
  • 全部特性都繼承自System.Attribute.必須有公用的構造器.特性還能夠應用到其餘特性上.

8,Struct

  • 繼承自System.ValueType(該類型爲Ref類型),不具有多態性。
  • 值類型,存儲在堆棧上.
  • 經常使用於存儲數據。沒有繼承性。只能實現接口。
  • 只能定義帶參構造器,不能有解析器,也不能有自定義無參構造(由於默認含有無參的Public構造).
  • 其能夠不使用New初始化,但這樣的話全部的字段都是未初始化狀態,直到全部字段都完成初始化,不然引用它就會編譯錯誤.
  • 能夠重載Object的3個方法:Equals,ToString,GetHashTable.
  • struct變量使用完後,自動解除內存分配.
  • 用途:主要用於存儲數據時,當數據量小時,結構數組有更高的效率,提供和非託管代碼兼容性.

9,CTS

  • 目的是建立一個跨語言的,類型安全,高性能代碼執行的框架.定義各個語言必須遵照的規則,以使得使用不一樣語言創建的對象可以進行交互.
  • CTS定義了MSIL使用的預約義類型.全部的.NET編譯器都是基於CTS實現的,由於全部的程序最後都要被編譯成IL.
  • CLS是CTS的子集,定義了面向.NET的開發語言所必須支持的最小集合.
  • CIL,IL定義了與機器無關的虛擬指令.在執行時IL會被翻譯成本地代碼.
  • .Net Framework能夠看作CIL在Win平臺下的實現.

10,參數

  • ref/out
    • 方法的定義和調用都須要有該keyword.不然編譯錯誤.
    • 容許是否使用該keyword而帶來的方法重載,而不能在二者之間進行.由於二者在編譯後生成的IL代碼是相同的.
    • ref傳遞的必須是一個初始化過的實際對象.
    • out能夠接受null參數,可是在方法返回以前,必須進行賦值.同時,方法體內,會將外界賦給參數的值清空.
  • 按值/引用傳遞參數
    • 按值傳遞.引用類型傳遞的是該引用的值,即對象的地址.值類型傳遞的是該值的一個副本,因此修改參數的值不會影響原值.
    • 按引用傳遞.引用/值類型傳遞的都是引用/值的地址.

11,委託

  • 存放着對方法引用的引用類型.
  • 可在全局範圍內定義.
  • 應用了策略模式.把變化的部分封裝起來.而後再把封裝的對象做爲一個對象傳遞給方法做爲參數.
  • 其實是一個類,可使用new來實例化生成對象.定義了方法的類型.
  • 容許把方法當作另外一方法的參數來傳遞.
  • 分離了方法的聲明和方法的實現.
  • 把對方法的引用封裝在委託對象中.
  • 調用時,用一個委託對象的變量來替代方法名稱.
  • 內部繼承關係:MultiDelegate->Delegate.
  • 字段:_target(方法所在類的對象,靜態方法時爲null)._MethodPtr(標識要調用的方法)._invocationList(委託鏈).
  • 委託鏈也是委託.可進行的操做是+=/-=.使用GetInvocationList()來獲取委託鏈.
  • 事件就是一種委託鏈.

Other

  • 枚舉打印(toString)時,輸出的是成員名稱,而非1,2,3.
  • 類只能經過引用存儲它的堆來訪問.對引用賦值,只會建立引用的副本,而非實例的副本,而後全部的引用都指向同一存儲區.
  • 可使用Using來簡化引用命名空間時的字符數.Using print= System.Consle.
  • 異常
    • 當沒有Catch語句時,執行到Finally後中止,以後的代碼會被忽略.
    • 有catch時,會執行完try-catch-finally,而後執行以後的代碼.
    • throw Exception以後的代碼不會被執行.
  • Box
    • 裝箱是隱式發生的.
    • 而拆箱必須顯式進行,而且類型要相同,兼容也不行.
  • 調用Windows API函數.

    • 引用System.Runtime.InterpServices;[DllImport(「XX」,Entry Point=」XXX」,CharSet=」XXXX」)]:XX爲Dll所在的位置(User32.dll);XXX爲所要引用的函數名,XXXX=UniCode/ANSI.

  • 繼承
    • 子類使用new來覆蓋父類的同名方法,而後再使用base.FunName()來調用被覆蓋的父類方法.
  • 泛型
    • CLR容許值,引用,接口,委託的泛型,不支持枚舉泛型.
    • CLR保證泛型並識別泛型的類型安全,而且不會產生拆箱,裝箱動做.
    • 編譯時T是一個佔位符.實例化時根據不一樣的傳入類型進行替換.
    • 不一樣的類型生成不一樣的代碼(Class).各個類之間沒有關係.
    • 靜態變量在不一樣類型的Class之間不會共享.
    • 重載方法.在實例方法調用時檢查(而非編譯時).當通常方法與泛型方法簽名相同時,通常方法優先.
    • 將泛型變量轉換爲另外一類型爲非法.除非另外一類型兼容約束,可先轉化爲Object後在進行該轉換;在沒有約束類型爲引用時,將泛型類型轉化爲NULL爲非法.可指定默認值;與NULL比較,當無約束時可正常運行,可是當約束爲Struct時,編譯錯誤;未約束爲引用時,對兩個變量的比較爲非法;不可將+,-*應用於非約束泛型類型上.
    • <T>類型參數(佔位符);<int>類型實參.
    • 開放類型:含有<T>的;封閉類型:每一個參數都是<int>的.只能構造封閉類型的instance.
    • ArrayList因爲會產生裝箱/拆箱操做,因此性能不如List<T>.
    • 類型推斷
      • 在調用泛型方法時,自動判斷所使用的類型.
      • 依據是變量的Type,而非引用的Type.因此是一種編譯時行爲.
    • 協變/逆變
      • 協變:子類到父類;逆變:父類到子類.
      • 僅泛型接口和委託支持,泛型類和方法不支持.
      • 原則:若一個幾口須要對T支持協/逆變,則該接口全部的方法參數必須支持對T的協/逆變.
  • 迭代器
    • foreach能夠用於任何實現了IEnumerator GetEnumerator()方法的類上,而沒必要非要實現IEnumerable接口.
    • 1  public IEnumerator<int> GetEnumerator()
      2         {
      3             int[] list = new int[]{1,2,3};
      4             foreach (int i in list)
      5                 yield return i;
      6         }
      GetEnumerator

       

    • yeild return 語句會使得Complier隱式生成一個實現了IEnumerable接口的內部類.
    • foreach的調用流程:GetEnumerator()->MoveNext()->return .Current.
    • 迭代器是延遲加載的,到in語句時纔會調用.
  • If (o is Employee){Employee e = (Employee)o}兩次轉換;Employee e = o as Employee; If(e ! Null )一次,並且永不拋出異常.
  • Static常量直接嵌入IL內,無內存及地址,僅可爲值類型(建立Type對象時建立,在類被夾在到AppDomain時建立).字段基於引用,ReadOnly(不可變的引用,而非不可變的對象)只可在構造器內爲可寫,其他只可讀.不支持常量方法/參數.
  • 值類型[],New時會建立Obejct=0;引用類型[],New會建立引用,而無實際的元素對象.
  • 消息隊列(MSMQ)
    • OS通訊的基礎(NT,2000以上),用於建立分佈式,鬆散鏈接通訊APP這些APP可經過不一樣種類的網絡通訊,亦可脫機.向斷開鏈接的隊列發送信息和有鏈接時同樣.
    • 用戶隊列:公用MSMQ:在全部網絡上覆制傳輸,可被全部站點訪問;專用MSMQ:僅在鎖駐留的本地PC上可用(只能當知道完整Path或檢查的APP訪問),管理MSMQ:指定但願隊列組件使用的管理的.響應MSMQ:目標APP接到消息返回給發送APP的相應信息.
    • 系統隊列:日記:可選地存儲,發送消息副本和刪除信息;死信:存放沒法傳遞或已過時的消息副本;專用系統:一系列系統執行處理操做所需的管理和通知消息的專用MSMQ.
    • 用途:1)數據庫經過發送Message來操做數據(節省:對數據庫鏈接請求數據的事件,從數據庫返回數據的事件),當客戶端不須要知道數據庫操做結果時;2)ERP:斷開鏈接時保存信息,鏈接恢復時發送消息,當隊列駐留的PC沒法工做,或者路由所需域控制器沒法工做時消息沒法投遞,MSMQ可以使消息暫存.
    • 因爲消息傳輸時佔用大量的帶寬.因此應該儘可能少使用.
  • 序列化
    • 能夠利用序列化技術建立對象的深拷貝.
    • 必須保證序列化/反序列化時使用相同的formatter.
    • 能夠將多個對象序列化到一個Stream中,而後以相同的順序從Stream中反序列化出各個對象.
    • 序列化一個對象時,Type的全名和Assembly名會寫入流中.
    • 反序列化時,使用Assembly.load方法加載Assembly.
    • 枚舉和委託類型老是可序列化的.
    • 父類可序列化,子類必須顯示聲明才能夠被序列化.
      • 子類爲可序列化,而父類不可,那麼結果亦是不可.
      • Object類是可序列化的.
      • 序列化會讀取一個對象的全部字段(包括private).
      • 若是類型含有敏感信息,應該設置爲不可序列化的.
    • [NoSerialized]標識不被序列化的屬性.
    • [Seralizable]標識的屬性不該使用自動屬性,由於其名稱不定.
  • JSON
    • 從結構上看,Data可分解爲3個部分
      • Scalar標量.一個單獨的字符串或者數字.
      • Sequence序列.有序的若干相關數據並在一塊兒,即數組.
      • Mapping映射.名/值對.又稱字典.
    • JOSN定義.
      • 逗號,並列的數據.
      • 冒號:映射.
      • 方括號[].並列數據的集合(數據).
      • 大括號{}.映射的集合(對象).
相關文章
相關標籤/搜索