C# 14與.NET10新功能 - 1

這一系列《C# 14與.NET10新功能》文章將介紹 .NET 10 和 C# 14版的重點新功能,並說明它們如何為未來的應用程式提供更好的效能與安全性保障,例如支援後量子密碼學(Post-Quantum Cryptography)以應對新興的威脅,幫助您快速掌握這些強大的新工具,並將它們應用到專案中。
新一代的.NET 10
首先.NET 10是一個具有里程碑意義的長期支援 (Long-Term Support, LTS)版本。這意味著它將獲得 Microsoft 長達三年的官方支援與安全性更新,一直到 2028年11月為止。對於初學者而言,這代表著一個穩定、可靠的學習起點;對於企業用戶,LTS 版本則是部署關鍵應用程式時,對穩定性與安全性的保證。
.NET 10 的核心設計理念圍繞四大部分,以打造一個更高效、更安全的開發平台:
◼ 性能(Performance):透過對執行階段(Runtime)和即時編譯器(JIT)的深度最佳化,讓應用程式執行得更快、資源消耗更少。
◼安全性(Security):引入對後量子密碼學(Post-Quantum Cryptography)的支援,並強化現有的加密與驗證機制,為未來的安全威脅做好準備。
◼開發者生產力(Developer
Productivity):透過 C# 14版的新語法和強化的 SDK 工具,消除樣板程式碼 (boilerplate
code),讓開發者能更專注於解決實際問題。
◼雲端原生 (Cloud-Native):深度整合容器化技術(如 Docker、Kubernetes)與微服務架構,讓部署和管理雲端應用程式變得前所未有的簡單。
在了解了.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開發工具為範例,選取「檔案」>「新增」>「檔案」建立一個檔案,請參考下圖所示:
在下一個畫面選取「C# 類別」項目,並設定檔案名稱,例如命為「hello.cs」,請參考下圖所示:

設定檔案名稱
這就是一個完整的 .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;
}
這個範例的執行的結果請參考下圖所示:
在筆者測試的過程中,執行應用程式時產生一些專案中沒有使用到的套件的警告訊息,請參考下圖所示:
我們可以在沒有專案檔的情況下用 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 本機工具資訊清單檔案,命令執行的結果請參考下圖所示:
「.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
這個命令執行的結果請參考下圖所示:
剪枝框架提供的套件參考
「剪枝框架提供的套件參考」 (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 意見:
張貼留言