2026年2月26日 星期四

C# 14與.NET10新功能 - 1

 


這一系列《C# 14.NET10新功能》文章將介紹 .NET 10 C# 14版的重點新功能,並說明它們如何為未來的應用程式提供更好的效能與安全性保障,例如支援後量子密碼學(Post-Quantum Cryptography)以應對新興的威脅,幫助您快速掌握這些強大的新工具,並將它們應用到專案中。

新一代的.NET 10

首先.NET 10是一個具有里程碑意義的長期支援 (Long-Term Support, LTS版本。這意味著它將獲得 Microsoft 長達三年的官方支援與安全性更新,一直到 202811月為止。對於初學者而言,這代表著一個穩定、可靠的學習起點;對於企業用戶,LTS 版本則是部署關鍵應用程式時,對穩定性與安全性的保證。

 

.NET 10 的核心設計理念圍繞四大部分,以打造一個更高效、更安全的開發平台:

◼ 性能(Performance:透過對執行階段(Runtime)和即時編譯器(JIT)的深度最佳化,讓應用程式執行得更快、資源消耗更少。

安全性(Security:引入對後量子密碼學(Post-Quantum Cryptography)的支援,並強化現有的加密與驗證機制,為未來的安全威脅做好準備。

開發者生產力(Developer Productivity:透過 C# 14版的新語法和強化的 SDK 工具,消除樣板程式碼 (boilerplate code),讓開發者能更專注於解決實際問題。

雲端原生 Cloud-Native:深度整合容器化技術(如 DockerKubernetes)與微服務架構,讓部署和管理雲端應用程式變得前所未有的簡單。

 

在了解了.NET 10 的目標後,我們將從最能簡化開發流程的新功能開始探索,踏出學習的第一步。

無需專案檔的檔案型應用程式(File-based apps)

在傳統的C# 專案開發流程中,即使是建立一個最簡單的、只印出一個「Hello, World!」訊息的主控台應用程式,也需要一個副檔名為「.csproj專案檔來定義專案設定和套件相依性。這對於初學者來說,往往會形成不必要的入門障礙。.NET 10版引入了一項革命性的功能——檔案型應用程式 File-based apps),徹底改變了這一現狀。現在,您可以直接單獨執行單一的 C# 檔案,極大地簡化了學習、原型設計和小型工具的開發流程。


更重要的是,此功能不僅是為了簡化學習,更是為了建立高效能的原生應用程式而產生。檔案型應用程式預設會以原生預先編譯 Native AOT為目標,讓您能輕鬆部署成單一、自帶執行環境且啟動極快的原生執行檔。

 

無需專案檔的檔案型應用程式(File-based apps)這項功能對於初學者來說:

◼ 降低入門門檻:無需理解複雜的專案結構、XML設定或管理NuGet 套件,就可開始編寫和執行 C#程式碼。

◼ 快速原型設計:當您有一個演算法或程式碼片段需要快速進行驗證時,這個功能就是一個絕佳的選擇,省去了建立完整專案的繁瑣步驟。

◼ 簡化小型工具開發:輕鬆建立單一檔案的命令列小工具或腳本程式,並能發布為高效能的原生執行檔。

 

無需專案檔的檔案型應用程式意味著您可以專注於邏輯本身,在單一檔案中建立一個簡單的主控台應用程式或文字處理工具,而完全不用看到 「.csproj 檔案。

 

使用方式

您可以使用任何文書處理軟體來建立無需專案檔的檔案型應用程式(File-based apps)。接著讓我們透過幾個簡單的步驟,使用Visual Studio 2026開發工具來建立、執行第一個檔案型應用程式,體驗一下這項功能帶來的便利性。

 

第一步先建立 C# 檔案,以下使用Visual Studio 2026開發工具為範例,選取「檔案」>「新增」>「檔案」建立一個檔案,請參考下圖所示:

1:建立一個檔案


在下一個畫面選取「C# 類別」項目,並設定檔案名稱,例如命為「hello.cs」,請參考下圖所示:

2設定檔案名稱


這就是一個完整的 .NET 10應用程式了,無需任何額外的設定檔,在「hello.cs檔案中加入以下程式碼:

Hello.cs

Console.WriteLine("Hello, World!");

選取「工具」>「命令列」>「終端」打開您的命令列工具:

3:開啟終端

先使用「cd」指令切換到「hello.cs檔案所在的目錄,然後執行以下命令:

dotnet hello.cs

或者以下指令,便可直接從命令列執行單一的「 .cs檔案:

dotnet run hello.cs

.NET SDK 會自動編譯並執行這個檔案,在螢幕上馬上可以看到輸出結果,執行的結果請參考下圖所示:


4:執行單一的「 .cs」檔案

.NET 10 不僅簡化了專案的建立過程,也透過 C# 14版的新語法讓程式碼本身變得更簡潔、更安全。

 

使用NuGet套件

若檔案型應用程式(File-based apps)需要使用到NuGet套件,可以使用「#:package」。

#:package」 是 C# 14 .NET 10 為支援 「單檔案應用程式」(File-based apps) 而引入的新預處理指示詞(preprocessor directives


只要在檔案上方使用「#:package NuGet 套件名稱」語法,開發者可以指定程式需要的 NuGet 套件及其版本,系統會自動處理套件的下載與引用。

 

例如想要使用「Microsoft.Data.SqlClient」套件,可以這樣使用

Hello.cs

// 設定程式檔案需要的 NuGet 套件版本(編輯器/工具用)

#:package Microsoft.Data.SqlClient@5.1.0

 

// 引用 Microsoft.Data.SqlClient 命名空間以使用SqlClient命名空間下的類別

using Microsoft.Data.SqlClient;

 

// 宣告並指定連線字串(連接本機 sqlexpress Northwind 資料庫,使用受信任連線)

var connectionString = @"Server=.\sqlexpress;Database=Northwind;Trusted_Connection=True;TrustServerCertificate=True;";

 

try {

    // 宣告並建立 `SqlConnection` 物件

    using var connection = new SqlConnection(connectionString);

    // 開啟資料庫連線

    connection.Open();

 

    // 建立一個SqlCommand物件以在該連線上執行查詢

    using var command = connection.CreateCommand();

    // 設定要執行的 SQL 查詢文字,選取員工編號與姓名欄位

    command.CommandText = "SELECT EmployeeID, FirstName, LastName FROM Employees";

 

    // 執行查詢並取得資料閱讀器(`ExecuteReader`

    using var reader = command.ExecuteReader();

    // 當有可讀取的資料列時使用迴圈處理每一列

    while (reader.Read()) {

        // 讀取第 0 欄(EmployeeID),若為 NULL 則回傳 0,否則取得整數值

        var id = reader.IsDBNull(0) ? 0 : reader.GetInt32(0);

        // 讀取第 1 欄(FirstName),若為 NULL 則回傳空字串,否則取得字串值

        var first = reader.IsDBNull(1) ? string.Empty : reader.GetString(1);

        // 讀取第 2 欄(LastName),若為 NULL 則回傳空字串,否則取得字串值

        var last = reader.IsDBNull(2) ? string.Empty : reader.GetString(2);

        // id 與名稱格式化並輸出到主控台

        Console.WriteLine($"{id}\t{first} {last}");

    }

 

    // 在正常完成後回傳 0 表示成功(在 top-level statements 中結束程式)

    return 0;

} catch (SqlException ex) {

    // 捕捉 SqlException(資料庫相關錯誤)並輸出錯誤訊息到主控台,回傳 1

    Console.Error.WriteLine("Database error: " + ex.Message);

    // 回傳 1 表示發生資料庫錯誤

    return 1;

} catch (Exception ex) {

    // 捕捉其他一般例外並輸出錯誤訊息到主控台,回傳 2

    Console.Error.WriteLine("Error: " + ex.Message);

    // 回傳 2 表示發生非資料庫的其他錯誤

    return 2;

}


這個範例的執行的結果請參考下圖所示:

5:使用NuGet套件範例執行結果

在筆者測試的過程中,執行應用程式時產生一些專案中沒有使用到的套件的警告訊息,請參考下圖所示:

6:套件的警告訊息


我們可以在沒有專案檔的情況下用 MSBuild 的共用設定檔來忽略這類警告。建議以下幾種做法:

◼ 最佳解法:移除或升級有漏洞的套件(不要只忽略警告)。

◼ 若確定接受風險,建立一個名為「Directory.Build.props」的檔案(放在「Hello.cs」相同資料夾或上層資料夾)來關閉全域的NU19xx 警告。

 

例如,在專案資料夾建立「Directory.Build.props」檔案內容如下,這會在 MSBuild 建置時加入要忽略的警告代碼(可依需要加或移除代碼):

Directory.Build.prop

<Project>

  <PropertyGroup>

    <NoWarn>$(NoWarn);NU1902;NU1903</NoWarn>

  </PropertyGroup>

</Project>


SDK與工具新特性

.NET SDK是建置、測試和部署應用程式的工具所成集合。.NET 10版在這個方面也帶來了相當實用的改進,說明如下。

一次性工具執行

.NET,許多有用的命令列公用程式是以 .NET 全域工具(Global Tools)的形式存在,例如程式碼分析器、文件產生器或自訂建置工具。在 .NET 10以前版本,若想使用這些工具,必須先使用 「dotnet tool install」命令將其以全域(Global)或本機(Local)的方式安裝到作業系統上。

新的「dotnet tool exec」命令允許您在不需要永久安裝 .NET 工具的情況下直接執行它。有時您只需要臨時使用某個工具,或者需要在持續整合/持續部署 (CI/CD)環境中執行這個工具,永久安裝的動作會增加環境設定的複雜性,也會佔用一些硬碟空間。一次性工具執行功能非常適合這種用於 CI/CD 流程,或只執行一次的臨時任務,保持開發環境的整潔。

dotnet tool exec命令可省去安裝步驟,當您執行此命令時,它會進行以下動作:

◼ 自動在背景下載並處理所需的 .NET 工具。

◼ 立刻執行這個工具程式並傳入您提供的引數。

◼ 程式執行結束後,此工具不會留在作業系統上,直接自動刪除,實現「一次性」的用途。

 

使用「dotnet tool exec」命令

我們來看一個dotnet tool exec」命令使用範例。假設您現在的環境裡根本沒有安裝「dotnet-ef」套件(不論是在全域或本機)。若不確定是否有安裝,我們可以開啟「開發人員PowerShell」命令提示字元,輸入「dotnet-ef」命令,這時若出現無法識別這個命令的錯誤訊息就代表環境裡沒有安裝,錯誤訊息請參考下圖所示:

7:沒有安裝套件出現錯誤訊息

 

「開發人員PowerShell」命令提示字元,切換到專案所在資料夾,執行以下命令:

dotnet new tool-manifest


這個命令會建立一個名為「.config\dotnet-tools.json」的Dotnet 本機工具資訊清單檔案,命令執行的結果請參考下圖所示:

8:建立Dotnet本機工具資訊清單檔案


.config\dotnet-tools.json」檔案內容如下列表,假設目前沒有安裝任何工具程式,「tools」的設定是空白的:

.config\dotnet-tools.json

{

  "version": 1,

  "isRoot": true,

  "tools": {}

}

 

在命令提示字元執行以下指令安裝「dotnet-ef」這個工具程式:

dotnet tool install dotnet-ef


這個命令執行的結果請參考下圖所示:

9:安裝「dotnet-ef」工具程式

 

安裝「dotnet-ef」工具程式之後,我們可以檢視Dotnet 本機工具資訊清單檔案「.config\dotnet-tools.json」的內容,參考如下,它記錄新安裝的套件名稱以及版本等資訊:

dotnet-tools.json

{

  "version": 1,

  "isRoot": true,

  "tools": {

    "dotnet-ef": {

      "version": "10.0.0",

      "commands": [

        "dotnet-ef"

      ],

      "rollForward": false

    }

  }

}

 

回到「開發人員PowerShell」命令提示字元再執行以下命令:

dotnet tool exec dotnet-ef


命令提示字元會出現「dotnet-ef」工具程式的歡迎畫面,請參考下圖所示:


10:執行「dotnet-ef」工具程式


若要確認目前已安裝的本機工具、全域工具,可以使用「dotnet tool list」命令,並指定「--local」或「--global」參數,分別代表本機與全域:

dotnet tool list –-local

dotnet tool list --global


這些命令執行的結果請參考下圖所示:


11:確認目前已安裝的工具

 

若要移除已安裝的工具程式,可以使用「dotnet tool uninstall 套件名稱」命令,例如要移除「dotnet-ef」公具程式可以輸入以下命令:

dotnet tool uninstall dotnet-ef


這個命令執行的結果請參考下圖所示:

12:移除工具程式

 

剪枝框架提供的套件參考

「剪枝框架提供的套件參考」 Pruning package references)是指 .NET 10 SDK中的一項重要功能,目地是在優化專案建置速度、減少磁碟空間並提高安全性。在建置專案時,現在SDK自動分析並移除不必要的 NuGet 套件參考。由其是大型專案中常常包含一些不再使用的套件參考,這會拖慢建置速度,並可能在安全性掃描時產生錯誤。

 

對於目標為 .NET 10或更高版本的專案這個功能預設是啟用的,預設會執行以下步驟:

◼ 從還原(restore)套件和分析過程中移除不必要的框架套件。

◼ 自動移除不必要的套件參考

 

簡單的說,「剪枝框架提供的套件參考」功能加快建置速度、減少磁碟空間使用,減少專案依賴關係和應用程式大小,並讓安全性警告更加精準。

 

總結

.NET 10 作為一個重要的長期支援 (LTS)版本,專注於提升性能、簡化開發流程和增強安全性,為程式設計師帶來了堅固可靠的開發平台。它不僅透過底層的最佳化讓應用程式執行更快,更透過對後量子密碼學等前瞻性技術的支援,為您的應用程式「未來防護」。.NET 10版的底層執行環境顯著的提升,這些看不見的改變,卻能帶來感受得到的效能飛躍。

對於初學者而言,檔案型應用程式(File-based apps)提供了一個前所未有的低門檻入口,讓您可以專注於學習 C# 語言本身,而不必被專案結構所困擾。

在持續整合/持續部署(CI/CD)流程的CI/CD伺服器上(例如 GitHub Actions Azure DevOps 的建置代理程式),每次建置都是在一個乾淨、臨時的環境中運行。如果您需要一個工具來執行特定的步驟(如格式化程式碼或執行安全性掃描),傳統上需要三個步驟:

◼ 安裝工具(浪費時間)

◼ 執行工具

◼  解除安裝工具(清理環境,避免未來衝突,浪費時間)

 

使用 「dotnet tool exec命令,這三個步驟被合併為一步,極大地提高了 CI/CD 腳本的效率和整潔性。

現在可以立即下載 .NET 10 SDK,從建立第一個應用程式開始,來逐步探索 .NET 10 帶來的各種功能,體驗新一代開發平台的高效與魅力吧!

 


0 意見:

張貼留言