C# 與 .NET

什麼是 C#

C# 專為微軟 .NET Framework 平台設計,讀音為「See Sharp」。

微軟需要一套統一、完全物件導向的整合開發框架,消除舊技術弊病,為此著手打造全新程式執行環境與開發工具鏈。

經過20多年的發展,C#已經從原本僅支援Windows系統,演變為現今可跨多平台執行的程式語言。

如今 C# 搭配 .NET 已是完整跨平台解決方案,可用於開發 Windows、macOS、Linux、Android 應用程式;同時它也是絕大多數雲端系統優先採用的執行時環境

得益於微軟長期大力投入維護,C# 版本迭代速度相當快速,2022 年推出第 7 版。C# 依舊能夠相容二十年前撰寫的舊程式碼,新版本語法更簡潔優雅、程式結構更加精簡。截至2026年,現行版本已是第 15 版

C# 版本發展簡史(節錄)

  • C# 1.0(2001):正式公開發布
  • C# 2.0(VS2005):泛型、迭代器、匿名方法
  • C# 3.0(VS2008):擴充方法、Lambda、LINQ(語言整合查詢)
  • C# 4.0(2010):具名 / 選擇性參數、dynamic動態型別、TPL 平行工作函式庫,完整發揮多核心處理器效能
  • C# 5.0:原生支援 async/await 非同步任務
  • C# 6.0:字串插值、運算式主體成員、屬性簡寫語法
  • C# 7.0~7.3:Tuple 多重回傳值、簡化out參數、模式比對、非同步Main方法
  • C# 8.0/9.0/10.0:記錄型別(不可變參考型別)、頂層陳述式(不需撰寫Main進入點)、預設介面方法、靜態區域函式、非同步可釋放型別、全語言範圍模式比對
  • C#11 (.NET7):原始字串、泛型數學、required 必要屬性
  • C#12 (.NET8):主建構子、集合簡寫語法、內嵌陣列
  • C#13 (.NET9):部分屬性、擴充索引子、迭代器ref區域變數
  • C#14 (.NET10):泛型別名、深度集合比對、SIMD 語法糖

Windows 仍舊是 C# 的核心開發平台,但透過 .NET Runtime,程式碼可直接在 Linux 等系統執行,實現一次撰寫、多系統部署。

.NET框架

.NET Framework 於2002年首次推出

.NET Framework 解決前代開發技術的各種痛點,核心優勢如下:

  1. 多裝置平台相容:可執行於伺服器、個人電腦、PDA、行動裝置等各式硬體;
  2. 遵循業界標準:原生支援 XML、HTTP、SOAP、JSON、WSDL 通用通訊協定;
  3. 安全沙箱機制:針對來源不可信的程式碼提供獨立安全執行隔離。

.NET Framework 三大核心組成

  1. CLR 共通語言執行平台(執行環境) 管控程式完整生命週期運作:記憶體管理與垃圾回收、程式碼安全驗證、執行緒排程、例外處理。
  2. 開發工具套件 整合開發環境、多語言.NET編譯器(C#/VB.NET/F#等)、偵錯工具、ASP.NET/WCF 網頁後端技術。
  3. BCL 基礎類別庫(又稱 FCL 框架類別庫) 內建海量通用類別,開發者可直接呼叫使用。

.NET 相較傳統 Windows 開發的升級重點

統一物件導向體系

CLR、BCL、C# 深度整合,提供單一標準OOP模型,桌面、行動裝置、網頁、分散式程式共用同一套開發範式,跨裝置語法與邏輯完全一致。

自動垃圾回收 GC

CLR 內建垃圾回收器,自動釋放不再使用物件佔用的記憶體;開發者無需手動釋放記憶體、排查記憶體洩漏,大幅降低維護難度。

多維度互通相容性
  1. 跨.NET語言互通:不同.NET語言撰寫的類別可互相呼叫、繼承,平台不綁定單一程式語言;
  2. P/Invoke 平台呼叫:直接呼叫原生 Win32 C 語言 DLL 介面;
  3. COM 相容支援:.NET元件與傳統COM元件可雙向互相呼叫。

部署流程簡化:無需依賴登錄檔,最簡單場景直接複製檔案即可執行程式;

並存組件機制:同一台裝置可共存多個版本DLL,各程式綁定自身編譯對應的函式庫版本,解決DLL版本衝突問題。

型別安全驗證 CLR(共通語言執行平台)強制檢查參數、資料型別,就算跨語言元件互動也會維持型別安全,阻擋非法記憶體存取行為。

完備的 BCL 基礎類別庫

內建大量通用工具類別

  • 檔案操作、字串處理、加密安全等基礎工具;
  • 串列、字典、雜湊表等集合容器;
  • 多執行緒、同步並行處理工具;
  • XML 文件讀寫處理類別
  • ……

所有通用底層邏輯都已預先實作,開發者僅需撰寫業務專屬邏輯,重複使用成熟工具,避免重複開發基礎功能

此為.NET程式執行流程圖,你撰寫的原始程式碼會編譯成中間語言IL,IL可呼叫BCL提供的函式庫,最後交由CLR執行。

C#和.NET的關係

.NET Framework:一套完整開發 & 執行平台,包含兩大核心元件

  1. CLR(共通語言執行平台):負責程式記憶體管理、執行、安全驗證
  2. BCL(基礎類別庫):海量通用工具程式碼(檔案、網路、介面、並行處理等)

C#:一種程式語言,專門為.NET平台設計,用來撰寫可在CLR上執行的程式碼

除了C#,還有其他程式語言支援.NET,例如F#、VB.NET。

.NET框架的設計目標是實現跨平台、跨語言。跨平台代表可在不同作業系統執行;跨語言代表不同語言開發的元件能夠互相存取呼叫。

編譯為共通中繼語言(CIL)

所有.NET語言的編譯器讀取原始程式檔,輸出名為組件(assembly)的輸出檔案

組件分為兩類:可執行程式(exe)或動態連結函式庫(DLL)

組件內部的程式並非CPU原生機器碼,而是一種稱為共通中繼語言(Common Intermediate Language,CIL)的中介程式碼。

一份組件主要包含以下三類內容:

  1. 程式的CIL指令程式碼
  2. 程式中所有型別的中繼資料
  3. 參考外部其他組件相依關係的中繼資料

這套中間語言的縮寫隨.NET發展有所變更,不同技術文件會使用不同名稱。像是中間語言(IL)微軟中間語言(MSIL),實際上全部指代CIL

編譯為原生機器碼並執行

CIL不會預先轉換為原生機器碼,僅有程式執行時,CLR會依序執行3個步驟:

  1. 驗證組件安全資訊
  2. 分配執行所需記憶體空間
  3. 交由JIT編譯器分段轉譯為原生機器碼
JIT 隨選編譯機制

只有實際執行到的程式區段才會進行編譯,編譯完成後快取重複使用;未被呼叫的程式不會編譯,同一區段程式僅編譯一次。

組件 (CIL + 型別資訊) → CLR (JIT 編譯器) → 原生機器碼 → 作業系統服務

CLR 託管執行職責

CIL轉換為原生程式碼後,CLR自動負責:垃圾記憶體回收、陣列越界偵測、參數型別驗證、例外錯誤處理。

託管程式與非託管程式
  • 託管程式碼:.NET語言撰寫的程式,執行流程依賴CLR控管
  • 非託管程式碼:不受CLR管理,例如原生C/C++ Win32 DLL

現今微軟已推出AOT預先編譯技術,可直接將C#完整編譯成本地原生程式,作法類似C++,不需安裝.NET執行環境就能直接執行EXE執行檔

NGen 工具

離線預先將組件編譯成本地原生映像檔,程式執行時可跳過JIT編譯步驟,大幅縮短開啟速度。

.NET Core AOT 為新一代預編譯方案,可產生完全無執行環境依賴的獨立原生執行檔

Assembly (Type Info, CIL)
        ↓
JIT Compiler
        ↓
Native Code
        ↓
Operating System Services

不論原始程式使用哪一種開發語言,都會遵循同一套編譯與執行流程

每種語言都配有專屬編譯器,VB.NET有VB.NET專用編譯器、C#有C#專用編譯器。所有編譯器都會將自身語言程式轉換為CIL,再交由JIT轉譯為原生機器碼,最後交給CPU執行。這就是為什麼.NET開發的軟體需要安裝.NET執行環境,和Java必須安裝JRE的道理相同。

flowchart TD
    subgraph Compile_Time
        A[C# Source] --> B[C# Compiler]
        B --> C[Assembly CIL]
        D[VB Source] --> E[VB Compiler]
        E --> C
        F[Xyz.NET Source] --> G[Xyz.NET Compiler]
        G --> C
    end

    subgraph Run_Time
        C --> H[JIT Compiler]
        H --> I[Native Code]
        I --> J[Operating System Services]
    end

上圖為各語言編譯、執行流程示意圖

共通語言執行平台(CLR)

CLR 是 .NET Framework 的核心元件,執行於作業系統上層,負責管控所有程式執行流程

  • 自動垃圾回收(GC)
  • 透過基礎類別庫(BCL)實作安全驗證與身分認證
  • 提供豐富完整的開發功能,包含Web服務、資料存取服務等機制
flowchart TD
    subgraph Unmanaged_Code
        A[Non-.NET Program] --> OS[Operating System]
    end

    subgraph Managed_Code
        B[Assembly] --> CLR[Common Language Runtime]
        C[Assembly] --> CLR
        D[Assembly] --> CLR

        subgraph CLR[Common Language Runtime]
            M[Memory Management] --- E[Exception Handling]
            G[Garbage Collection] --- R[Reflection Services]
            J[JIT Compiler] --- L[Class Loader]
            S[Security Services]
        end

        CLR --> OS
    end

共通語言基礎架構(CLI)

每一種程式語言都內建一組基礎原生型別,用來表示整數、浮點數、字元等各類資料。

共通語言基礎架構(CLI) 是一套標準規範集合,將.NET Framework所有元件整合為統一、具互通性的完整體系。

舉例來說,整數佔用的二進位位元長度,在所有相容語言中皆採用統一標準。

flowchart TD
    subgraph CLI[CLI]
        CLR[Common Language Runtime] --- CLS[Common Language Specification]
        BCL[Base Class Library] --- MDS[Metadata Definition & Semantics]
        CTS[Common Type System] --- CIL[Common Intermediate Language]
    end

多數開發者不需深究CLI完整規範,但務必熟練掌握CTS 共通型別系統CLS 共通語言規範

CTS 共通型別系統

  • 定義一套標準基礎資料型別,各型別屬性固定不變;
  • 各.NET語言自有的資料型別,都會對應映射至這套標準型別的子集;
  • 系統內所有型別全部繼承自根基底類別 object
  • 這套統一標準讓系統內建型別、開發者自訂型別,可跨任意.NET語言互相呼叫使用。

CLS 共通語言規範

定義所有相容.NET的語言必須遵守的統一規則,涵蓋資料型別、類別建構、參數傳遞等跨語言互動約束。

.NET與.NET Framework的差異

.NET是微軟現代跨平台開發平台,而.NET Framework是早期僅限Windows執行的執行時與函式庫套件。所有新功能僅會持續在.NET開發更新,.NET Framework已進入維護週期,僅釋出安全性修補程式。

.NET具備完整跨平台能力,也是目前微軟主力維護開發的產品。後續內容將以.NET作為主要解說對象。

特性.NET.NET Framework
平台支援跨平台(Windows、Linux、macOS、容器、透過MAUI支援行動裝置)僅支援Windows
開發狀態持續更新(.NET 5 → .NET 10,年度發布、提供LTS長期支援)維護模式(4.8為最終版本,僅釋出安全修補)
執行效能啟動速度更快、處理吞吐量更高、垃圾回收機制經過改良效能偏舊、高度依賴Windows原生API
適用場景全新專案:Web API、微服務、雲原生應用、跨平台桌面/行動程式舊有專案:Web Forms、WCF、Windows Workflow等
部署方式完整支援Docker、容器化、雲端主機環境不支援容器,依賴Windows Server伺服器
支援語言C#、F#、VB.NET(完整跨平台執行)C#、VB.NET(僅限Windows)

.NET 和 .NET Framework 的差異其實不大。兩者都支援 C#、F#、VB.NET 等程式語言,核心語法維持一致。多數場景下,你撰寫的C#程式碼可同時在.NET Framework與新式.NET(Core/5/6/7/8…)上編譯執行。

兩者的差異主要集中在可用函式庫,而非語法本身。

.NET Framework內建的WCFWeb FormsWindows Workflow,在新式.NET中已被移除或替換。

新式.NET新增Span<T>ValueTaskRecords等現代API,這些功能在舊版.NET Framework無法使用。

由於.NET Framework僅限Windows單一平台,新式.NET為跨平台架構,因此.NET移除部分Windows專屬函式庫。舉例:System.Drawing在Windows可正常使用,但跨平台版.NET會標註為僅Windows支援。若要在跨平台.NET開發繪圖功能,無法使用System.Drawing,需改用第三方函式庫,例如Google開發的SkiaSharp

請注意以上差異都屬於框架層面;以C#這類語言層面來看,兩者幾乎沒有區別,你撰寫的C#語法在兩套環境完全通用。真正的核心差異在於函式庫與執行環境,也就是可呼叫的API不完全相同。

C#和.NET

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *