C#高級特性及項目實戰Day1


 

.Net Framework

  MSDN的解釋:NET Framework是為其運行的應用程序提供各種服務的托管執行環境,它包括兩個主要組件:作為處理運行的應用程序的執行引擎的公共語言運行時(CLR),以及.NET Framework類庫 此類庫提供開發人員可從起自己應用程序中調用的已測試的可重用代碼庫

  CLR是.NET Framework的核心

  CLR的核心是CTS和CLS 任何編程語言 如果想要在.NET CLR上執行,就必須提供一個編譯器,

  將此語言的程序編譯成.NET CLR所認識的metadata以及IL 符合CTS的規定

        CTS是通用類型系統(Common Type System)

             CLS是公共語言定義(Common Language Specification) 

     CLR是公共語言運行時(Common language runtime)

    

    公告語言規范CLS     

    CLR集成了很多種語言,它們之間可以相互訪問,是因為CLR建立的標准的類型集、元數據、公共執行環境。由於各種語言間存在着極大的差別,如區分大小寫,有的不支持          unsigned、操作符重載或者參數可變的方法,所以要想創建這種讓別的語言能訪問的程序,自己所用的編程語言只能使用其它語言都支持的那些特性。為了幫助我們更好的做到這一點,Microsoft定義了一個"公共語言規范(Common Language Specification,CLS)"

CTS定義了一組語言編譯器必須遵循的規則,以定義、引用、使用和存儲引用類型和值類型。因此,遵循CTS,在不同語言中編寫的對象才能彼此交互。但並不是所有的類型都可以用於所有的語言。

                                

  

                         

Language complier:語言編譯器,每種語言基於.net的語言都會有一個面向CLR的托管模塊,也可以理解為語言編譯器,把對應的語言編譯成MSIL

MSIL:微軟中間語言,CLR負責把中間語言編譯成為執行程序的計算機可以理解的語言,是一種介於介於高級語言和匯編語言的偽匯編語言.

JIT(Just In-Time compile):即時編譯,將MSIL解釋為程序可以理解的語言.

 

       1、將源代碼(vb、cs)編譯成 托管代碼塊。托管代碼塊由中間語言和元數據組成。

  2、將托管代碼合並成程序集,也叫組件(dll)。程序集中包含了一張叫做“清單”的模塊,

            記錄了構成程序 集模塊構成的信息包括資源文件及需要引用自己的信息。

  3、加載公共語言運行庫。

  4、執行程序集的代碼。

  5、生成本地代碼。

 

CLI,公共語言基礎架構(Common Language Infrastructure)

CLI是一個開放的技術規范。它是由微軟聯合惠普以及英特爾於2000年向ECMA倡議的。通用語言基礎架構定義了構成.NET Framework基礎結構的可執行碼以及代碼的運行時環境的規范,它定義了一個語言無關的跨體系結構的運行環境,這使得開發者可以用規范內定義的各種高級語言來開發軟件,並且無需修正即可將軟件運行在不同的計算機體系結構上。CLI有時候會和CLR混用。但嚴格意義上說,這是錯誤的。因為CLI是一種規范,而CLR則是對這種規范的一個實現。

歐洲計算機制造商協會(ECMA)已經於2001年10月13日批准C#語言規范(ECMA-334)成為一種新誕生的計算機產業標准。同時國際標准組織ISO也同意該標准進入該組織的審批階段。並且,作為.NET與CLR的核心部分,CLI與C#也同時獲得了ECMA的批准(ECMA-335)。擁有了C#與CLI這兩項標准,你可以自己寫出能夠運行於任何操作系統上的.NET平台(只要你願意)。如前所述,著名的MONO項目就是這么干的,MONO項目包括三個核心的部分:一個C#語言的編譯器,一個CLI和一個類庫

 

BCL,基礎類庫(Base Class Library)

BCL是一個公共編程框架,稱為基類庫,所有語言的開發者都能利用它。是CLI(Common Language Infrastructure,公共語言基礎結構)的規范之一,主要包括:執行網絡操作,執行I/O操作,安全管理,文本操作,數據庫操作,XML操作,與事件日志交互,跟蹤和一些診斷操作,使用非托管代碼,創建與調用動態代碼等,粒度相對較小,為所有框架提供基礎支持。

 

FCL,框架類庫(Framework Class Library)

FCL提供了大粒度的編程框架,它是針對不同應用設計的框架 ,FCL大部分實現都引用了BCL,例如我們常說的開發框架:ASP.NET、MVC、WCF和WPF等等,提供了針對不同層面的編程框架 。

 

1、托管代碼就是Visual Basic .NET和C#編譯器編譯出來的代碼,托管代碼在公共語言運行庫(CLR)中運行

2、非托管代碼是運行在公共語言運行庫環境(CLR)的外部,由操作系統直接執行的代碼。非托管代碼必須提供自己的垃圾回收、類型檢查、安全支持等服務

 

區別:

     1、托管代碼是一種中間語言,運行在CLR上;

          非托管代碼被編譯為機器碼,運行在機器上。

     2、托管代碼獨立於平台和語言,能更好的實現不同語言平台之間的兼容;

          非托管代碼依賴於平台和語言。

     3、托管代碼可享受CLR提供的服務(如安全檢測、垃圾回收等),不需要自己完成這些操作;

          非托管代碼需要自己提供安全檢測、垃圾回收等操作。

     4、.Net有很多非托管的資源,比如StreamWriter、 Timer、數據庫連接。

 

unsafe可以用來修飾類、類的成員函數、類的全局變量,但不能用來修飾類成員函數內的局部變量

在公共語言運行時 (CLR) 中,不安全代碼是指無法驗證的代碼。 C# 中的不安全代碼不一定是危險的;只是其安全性無法由 CLR 進行驗證的代碼。 因此,CLR 只對在完全受信任的程序集中的不安全代碼執行操作。 如果使用不安全代碼,由您負責確保您的代碼不會引起安全風險或指針錯誤

 

運行unsafe ,需要設置:

  單擊“配置屬性”文件夾。     
  單擊“生成”屬性頁。     
  修改“允許不安全代碼塊”屬性

 

什么是GC?

GC(Garbage Collector)如其名,就是垃圾收集,這里僅就內存而言。

 

GC工作的原理:GC遍歷應用程序在Heap(堆)上動態分配的所有對象,通過識別它們是否被引用來確定哪些對象是已經死亡的、哪些仍需要被使用,已經不再被應用程序所引用的對象就是已經死亡的對象,即所謂的垃圾,需要被回收。

 

.NET的GC機制兩個問題:

  首先,GC並不是能釋放所有的資源。它不能自動釋放非托管資源。

  第二,GC並不是實時性的,這將會造成系統性能上的瓶頸和不確定性

GC並不是實時性的,這會造成系統性能上的瓶頸和不確定性。所以有了IDisposable接口,IDisposable接口定義了Dispose方法,這個方法用來供程序員顯式調用以釋放非托管資源。使用using語句可以簡化資源管理

GC.Collect() 方法  作用:強制進行垃圾回收

 

元數據:是一種二進制信息,用以對存儲在公共語言運行庫可移植可執行文件 (PE) 文件或存儲在內存中的程序進行描述。將您的代碼編譯為 PE 文件時,便會將元數據插入到該文件的一部分中,而將代碼轉換為 Microsoft 中間語言 (MSIL) 並將其插入到該文件的另一部分中。在模塊或程序集中定義和引用的每個類型和成員都將在元數據中進行說明。當執行代碼時,運行庫將元數據加載到內存中,並引用它來發現有關代碼的類、成員、繼承等信息。

 

元數據存儲以下信息:

程序集的說明

類型的說明

屬性

 

框架體系運行概述:

首先編寫的C#源文件hello.cs通過C#編譯器進行編譯,編譯成.NET 的PE文件結構,也就是exe文件格式,當程序運行時,Windows的Loader加載器不會負責該程序的內存分配,線程管理等工作,而是只負責跳轉到CLR的執行引擎(EE)中,將控制權交由CLR,由CLR進行分配內存,線程管理,異常處理等。

 

1.IL/MSIL/CIL Microsoft Intermediate Language)微軟中間語言(IL是MSIL的縮寫,譯為中間語言)

2.CTS  (Common Type System)通用類型系統

3.CLS  (Common Language Specification)公共語言規范

4.CLR  (Common Language Runtime)公共語言運行時(也有的叫公共語言運行庫)

5.JIT  (Just in time)即時編譯器

6.CLI   公共語言基礎架構(Common Language Infrastructure)

7. BCL  基礎類庫(Base Class Library)

8. FCL  框架類庫(Framework Class Library)

 

 

    

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM