.NET HELP C# Init Keyword (How It Works For Developers) Jacob Mellor 更新:2025年7月28日 下載 IronPDF NuGet 下載 DLL 下載 Windows 安裝程式 開始免費試用 法學碩士副本 法學碩士副本 將頁面複製為 Markdown 格式,用於 LLMs 在 ChatGPT 中打開 請向 ChatGPT 諮詢此頁面 在雙子座打開 請向 Gemini 詢問此頁面 在 Grok 中打開 向 Grok 詢問此頁面 打開困惑 向 Perplexity 詢問有關此頁面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 複製連結 電子郵件文章 C# 9.0 中的init關鍵字引入了一種新的定義類屬性的方法,用於創建不可變的物件。 在 C# 的早期版本中,properties 通常與 get 和 set 存取器一起使用,以從物件欄位讀取或寫入物件欄位。 但是,使用 init,您可以僅在物件初始化時使屬性可寫,之後使其成為唯讀。 本教學將以 IronPDF 函式庫的實用範例和情境,探索如何使用 C# init 關鍵字。 您也將學習到傳統的屬性設定器 (set) 與新的僅限於 init 的設定器之間的關鍵差異。 Init 關鍵字的基本範例 讓我們從一個基本的例子開始: public class Person { public string FirstName { get; init; } public string LastName { get; init; } } var person = new Person { FirstName = "Iron", LastName = "Dev" }; // person.FirstName = "Jane"; // This will give a compile-time error. public class Person { public string FirstName { get; init; } public string LastName { get; init; } } var person = new Person { FirstName = "Iron", LastName = "Dev" }; // person.FirstName = "Jane"; // This will give a compile-time error. $vbLabelText $csharpLabel 。 在此示例中,FirstName 和 LastName 被標示為啟始專用屬性。 這表示它們只能在物件初始化時指定。 物件建立後,嘗試變更數值會導致編譯時錯誤。 為什麼要使用 Init 關鍵字? 使用 init 關鍵字的主要原因是要讓物件的屬性在初始化後不可變。 傳統上,您可以將屬性標示為唯讀,以達到不變的目的。 然而,您通常會需要一個能接受所有必要值的建構器來設定欄位,這可能會導致建構器產生模板程式碼。 使用 init,您可以使用物件初始化器達到相同的目標,而不需要撰寫冗長的建構器。 public class Person { public string FirstName { get; init; } public string LastName { get; init; } // Without using constructor boilerplate for property initialization } var person = new Person { FirstName = "John", LastName = "Doe" }; public class Person { public string FirstName { get; init; } public string LastName { get; init; } // Without using constructor boilerplate for property initialization } var person = new Person { FirstName = "John", LastName = "Doe" }; $vbLabelText $csharpLabel Object Initialization with Init-Only Properties 使用僅初始化屬性進行物件初始化 使用 init 可與物件初始化器無縫配合。 您可以在建立物件時直接定義所需的屬性,而不必仰賴建構器來設定值。 public class Point { public int X { get; init; } public int Y { get; init; } } var point = new Point { X = 10, Y = 20 }; // point.X = 30; // This will throw a compile-time error public class Point { public int X { get; init; } public int Y { get; init; } } var point = new Point { X = 10, Y = 20 }; // point.X = 30; // This will throw a compile-time error $vbLabelText $csharpLabel 這會建立一個類型為 Point 的簡單、不可變的物件。 請注意,X 和 Y 的值是在初始化時設定的,之後不能修改。 將 init 與 Constructors 混合 雖然 init 的主要用例是透過物件初始化器來初始化物件,但若有需要,您仍可使用構建器。 在物件建立過程中強制執行特定的屬性值時,這一點尤其有用。 public class Person { public string FirstName { get; init; } public string LastName { get; init; } public Person(string firstName, string lastName) { FirstName = firstName; LastName = lastName; } } public class Person { public string FirstName { get; init; } public string LastName { get; init; } public Person(string firstName, string lastName) { FirstName = firstName; LastName = lastName; } } $vbLabelText $csharpLabel 您可以同時使用構建器和 init 屬性。 此方法提供更多的彈性,同時在物件建構後仍能強制執行不可變性。 Init Over Private Set 的優點 以前,開發人員使用私有的 set accessor 來限制在類別之外的屬性修改。 public class Person { public string FirstName { get; private set; } public string LastName { get; private set; } public Person(string firstName, string lastName) { FirstName = firstName; LastName = lastName; } } public class Person { public string FirstName { get; private set; } public string LastName { get; private set; } public Person(string firstName, string lastName) { FirstName = firstName; LastName = lastName; } } $vbLabelText $csharpLabel 儘管這種方法可行,但需要使用構建器的模板程式碼來初始化屬性。 此外,它允許類本身稍後修改屬性,這對不可變的物件來說並不總是理想的做法。 init 關鍵字消除了這個問題,因為它只允許在物件建立時進行初始化,之後的任何修改都會被阻擋。 使用唯讀欄位和初始存取器處理初始化 init 關鍵字可以在建立物件時初始化欄位或屬性,而之後這些欄位或屬性仍保持不變。 唯讀欄位提供不變性,而 init 存取器則為屬性提供類似的功能。 這裡有兩種處理不可變性的方法:使用唯讀欄位和 init 屬性。 使用構成器的唯讀欄位 在這個範例中,我們使用 firstName 和 lastName 的唯讀欄位,這些欄位會在物件建構時設定。 這些欄位只能在構建器中指定一次,之後不能修改: public class Person { private readonly string firstName; private readonly string lastName; public string FirstName => firstName; public string LastName => lastName; public Person(string firstName, string lastName) { this.firstName = firstName; this.lastName = lastName; } } public class Person { private readonly string firstName; private readonly string lastName; public string FirstName => firstName; public string LastName => lastName; public Person(string firstName, string lastName) { this.firstName = firstName; this.lastName = lastName; } } $vbLabelText $csharpLabel 使用 Init Accessor 進行初始化 另外,我們也可以使用 init 存取器來建立唯讀的屬性,這些屬性可以在物件建立時初始化,但之後就無法變更。 這樣就不需要只讀欄位,並提供更現代化的語法: public class Person { public string FirstName { get; init; } public string LastName { get; init; } } public class Person { public string FirstName { get; init; } public string LastName { get; init; } } $vbLabelText $csharpLabel IronPDF 簡介 IronPDF是專為 C# 開發人員設計的功能強大的 PDF 產生和處理函式庫。 它簡化了使用 PDF的工作,將 HTML、CSS、圖片和其他內容轉換成 PDF 文件。 IronPDF 具備像素完美渲染、跨平台支援以及輕鬆整合至 .NET 專案等功能,是需要快速建立高品質 PDF 的開發人員的理想選擇。 您可以在 .NET Core、Framework 和 Standard 上使用它,而且它支援多種平台,包括 Windows、Linux 和 macOS。 案例:使用 IronPDF 與 C# Init 關鍵字 若要在 C# 專案中建立不可變的物件,同時產生 PDF,您可以結合 init 關鍵字與 IronPDF。 init 關鍵字可確保物件初始化後的完整性,而 IronPDF 則會根據該不可變模型處理資料並產生 PDF。 確保 IronPDF 在您的專案中被正確引用。 您可以透過 NuGet 安裝: Install-Package IronPdf 以下是程式碼範例: using IronPdf; public class Person { public int Id { get; init; } public string FirstName { get; init; } public string LastName { get; init; } } public class PDFGenerator { public static void CreatePersonPDF(Person person) { var htmlContent = $@" <html> <body> <h1>Person Information</h1> <p>ID: {person.Id}</p> <p>First Name: {person.FirstName}</p> <p>Last Name: {person.LastName}</p> </body> </html>"; var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(htmlContent); pdf.SaveAs($"Person_{person.Id}.pdf"); } } class Program { static void Main(string[] args) { var person = new Person { Id = 1, FirstName = "Iron", LastName = "Dev" }; PDFGenerator.CreatePersonPDF(person); } } using IronPdf; public class Person { public int Id { get; init; } public string FirstName { get; init; } public string LastName { get; init; } } public class PDFGenerator { public static void CreatePersonPDF(Person person) { var htmlContent = $@" <html> <body> <h1>Person Information</h1> <p>ID: {person.Id}</p> <p>First Name: {person.FirstName}</p> <p>Last Name: {person.LastName}</p> </body> </html>"; var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(htmlContent); pdf.SaveAs($"Person_{person.Id}.pdf"); } } class Program { static void Main(string[] args) { var person = new Person { Id = 1, FirstName = "Iron", LastName = "Dev" }; PDFGenerator.CreatePersonPDF(person); } } $vbLabelText $csharpLabel 結論 。 總而言之,C# init 關鍵字允許您建立不可變的物件,同時在物件初始化時提供彈性。 它是私有集存取器的一個更乾淨、更安全的替代方案,減少了對構建器模板程式碼的需求。 將 init 關鍵字與唯讀欄位、結構及驗證邏輯相結合,可協助您建立強大且安全的資料結構,在不犧牲可讀性或彈性的情況下,保留不變性。 IronPdf 提供 免費試用,而授權費則從 $799 起。 這可讓您使用其完整功能,包括編輯、壓縮和保護 PDF。 常見問題解答 如何在 C# 中將 HTML 轉換為 PDF? 您可以使用 IronPDF 的 RenderHtmlAsPdf 方法將 HTML 字串轉換成 PDF。您也可以使用 RenderHtmlFileAsPdf 將 HTML 檔案轉換成 PDF。 C# 中的 init 關鍵字有何作用? init 關鍵字允許您定義只能在物件初始化時設定的屬性,以確保初始化後的不變性。此功能對於建立一旦建立就不應改變的物件特別有用。 init 關鍵字如何增強 C# 中物件的不變性? init 關鍵字使屬性只能在物件的初始化階段設定,以防止之後的任何變更。這可確保物件在建立後保持不變。 init 屬性是否可與用於 PDF 產生的函式庫一起使用? 是的,init 屬性可與 IronPDF 等函式庫搭配使用,從不可變的物件產生 PDF,確保 PDF 所使用的資料在整個過程中保持一致。 使用 init 關鍵字相較於傳統的 setters 有哪些優點? 使用 init 關鍵字而非傳統的 setters 可促進不變性,減少對冗長的構建程式碼的需求,並確保物件的屬性在初始化後無法修改。 如何在 C# 中整合 PDF 生成與不可變屬性? 您可以使用 init 屬性建立不可變的物件,並將這些物件傳給 IronPDF,IronPDF 可以利用這些資料產生一致且可靠的 PDF 文件。 init 關鍵字在建立現代 C# 應用程式中扮演什麼角色? init 關鍵字在建立現代 C# 應用程式的過程中扮演著重要的角色,它能讓開發人員使用簡潔的語法定義不可變的物件、增強程式碼的安全性,並減少 bug。 如何在 C# 專案中安裝 PDF 生成函式庫? 您可以使用 NuGet Package Manager 指令在 C# 專案中安裝 IronPDF 之類的函式庫:Install-Package IronPdf。 為什麼應用程式開發中的不變性很重要? 不可重复性非常重要,因为它可以确保整个应用程序的数据完整性和一致性,使其更易于维护并降低出现错误的可能性。 有哪些實例可以說明 init 關鍵字的用法? 一個實用的範例是使用 init 關鍵字來定義一個具有只能在初始化時設定的屬性的類別,以確保所建立的物件保持不變。這在資料一致性非常重要的情況下特別有用。 Jacob Mellor 立即與工程團隊聊天 首席技術長 Jacob Mellor 是 Iron Software 的首席技術長,也是開創 C# PDF 技術的有遠見的工程師。作為 Iron Software 核心程式碼庫背後的原始開發人員,他從公司成立之初就塑造了公司的產品架構,與首席執行官 Cameron Rimington 一起將公司轉型為一家 50 多人的公司,為 NASA、Tesla 和全球政府機構提供服務。Jacob 持有曼徹斯特大學土木工程一級榮譽工程學士學位 (BEng)(1998-2001 年)。Jacob 於 1999 年在倫敦開設了他的第一家軟體公司,並於 2005 年創建了他的第一個 .NET 元件,之後,他專門解決微軟生態系統中的複雜問題。他的旗艦產品 IronPDF & Iron Suite for .NET 函式庫在全球的 NuGet 安裝量已超過 3000 萬次,他的基礎程式碼持續為全球使用的開發人員工具提供動力。Jacob 擁有 25 年的商業經驗和 41 年的編碼專業知識,他一直專注於推動企業級 C#、Java 和 Python PDF 技術的創新,同時指導下一代的技術領導者。 相關文章 更新2025年12月11日 Bridging CLI Simplicity & .NET : Using Curl DotNet with IronPDF Jacob Mellor has bridged this gap with CurlDotNet, a library created to bring the familiarity of cURL to the .NET ecosystem. 閱讀更多 更新2025年12月20日 RandomNumberGenerator C# Using the RandomNumberGenerator C# class can help take your PDF generation and editing projects to the next level 閱讀更多 更新2025年12月20日 C# String Equals (How it Works for Developers) When combined with a powerful PDF library like IronPDF, switch pattern matching allows you to build smarter, cleaner logic for document processing 閱讀更多 FileStream C# (How It Works For Developers)C# Semaphoreslim (How It Works For ...
更新2025年12月11日 Bridging CLI Simplicity & .NET : Using Curl DotNet with IronPDF Jacob Mellor has bridged this gap with CurlDotNet, a library created to bring the familiarity of cURL to the .NET ecosystem. 閱讀更多
更新2025年12月20日 RandomNumberGenerator C# Using the RandomNumberGenerator C# class can help take your PDF generation and editing projects to the next level 閱讀更多
更新2025年12月20日 C# String Equals (How it Works for Developers) When combined with a powerful PDF library like IronPDF, switch pattern matching allows you to build smarter, cleaner logic for document processing 閱讀更多