跳過到頁腳內容
.NET幫助

C# 初始化關鍵字 (如何為開發人員運作)

C# 9.0 中的init 關鍵字引入了一種定義類別屬性以建立不可變物件的新方法。 在早期版本的 C# 中,屬性通常與 get 和 set 存取器一起使用,用於讀取和寫入物件欄位。 但是,使用 init 方法,您可以僅在物件初始化期間將屬性設為可寫,之後將其設為唯讀。

本教學將透過IronPDF庫的實際範例和場景,探討如何使用C# init關鍵字。 你還將了解傳統屬性設定器(set)和新的僅初始化設定器之間的關鍵差異。

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

C# Init 關鍵字(開發者如何理解):圖 1 - 由於屬性被標記為 init-only,IDE 拋出錯誤

在這個例子中,FirstNameLastName 被標記為僅初始化屬性。 這意味著它們只能在物件初始化期間賦值。 物件建立後,嘗試變更其值會導致編譯時錯誤。

為什麼要使用 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

使用僅初始化屬性進行物件初始化

使用 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 類型的物件。 請注意,XY 的值在初始化時設置,以後無法修改。

將初始化與建構函式混合使用

雖然 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

你可以同時使用建構子和初始化屬性。 這種方法提供了更大的靈活性,同時在物件建構後仍能保證其不可變性。

初始化相對於私有集合的優勢

以前,開發人員使用私有集合存取器來限制類別外部的屬性修改。

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 存取器為屬性提供了類似的功能。 您可以透過兩種方式處理不可變性:使用唯讀欄位和初始化屬性。

使用建構函數定義唯讀字段

在這個例子中,我們使用唯讀欄位 firstNamelastName,這些欄位是在物件建構期間設定的。 這些欄位只能在建構函式中賦值一次,之後不能修改:

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 存取器建立唯讀屬性,這些屬性可以在物件建立期間初始化,但之後不能變更。 這樣就無需使用唯讀字段,並提供了一種更現代的語法:

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簡介

C# 初始化關鍵字(開發者如何理解):圖 2 - IronPDF:C# PDF 函式庫

IronPDF是一個功能強大的 PDF 生成和處理庫,專為 C# 開發人員設計。 它透過將 HTML、CSS、圖像和其他內容轉換為 PDF 文檔,簡化了 PDF 的操作。 IronPDF具有像素級完美渲染、跨平台支援以及輕鬆整合到.NET專案中等功能,是需要快速建立高品質 PDF 的開發人員的理想選擇。 您可以將其與.NET Core、.NET Framework 和 .NET 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# 初始化關鍵字(開發者使用方法):圖 3 - IronPDF授權頁面

總而言之,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 關鍵字比傳統設置器有何優勢?

相較於傳統設置器,使用 init 關鍵字可以提升不可變性,減少冗長的構造函數代碼,並確保在初始化後物件屬性無法修改。

如何將 PDF 生成與 C# 中的不可變屬性集成?

您可以使用 init 屬性創建不可變對象並將其傳遞給 IronPDF,這可以利用數據生成一致且可靠的 PDF 文檔。

init 關鍵字在創建現代 C# 應用程序中扮演了什麼角色?

init 關鍵字在創建現代 C# 應用程序中非常重要,因為它允許開發者以簡潔的語法定義不可變對象,提高代碼的安全性並減少錯誤。

如何在 C# 項目中安裝 PDF 生成庫?

您可以使用 NuGet Package Manager 利用以下命令在 C# 項目中安裝像 IronPDF 這樣的庫:Install-Package IronPDF

為什麼不可變性在應用程序開發中很重要?

不可變性很重要,因為它確保了應用程序中的數據完整性與一致性,使得維護更容易且降低了錯誤發生的可能性。

有哪些實用例子展示 init 關鍵字的使用?

一個實例是使用 init 關鍵字定義一個類,其屬性只能在初始化時設置,確保所創建的對象保持不變。這在數據一致性至關重要的情況下特別有用。

Jacob Mellor, Team Iron 首席技術官
首席技術官

Jacob Mellor是Iron Software的首席技術官,也是開創C# PDF技術的前瞻性工程師。作為Iron Software核心代碼庫的原始開發者,他自公司成立以來就塑造了公司的產品架構,並與CEO Cameron Rimington將公司轉型為服務NASA、Tesla以及全球政府機構的50多人公司。

Jacob擁有曼徹斯特大學土木工程一級榮譽學士學位(1998年–2001年)。他於1999年在倫敦開立首家軟體公司,並於2005年建立了他的第一個.NET組件,專注於解決Microsoft生態系統中的複雜問題。

他的旗艦作品IronPDF和Iron Suite .NET程式庫全球已獲得超過3000萬次NuGet安裝,他的基礎代碼不斷在全球各地驅動開發者工具。擁有25年以上的商業經驗和41年的編碼專業知識,Jacob仍然專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me