跳至頁尾內容
.NET 幫助

C# 記錄與類別(開發者如何理解它們)

在 C# 的世界裡,有兩種主要的結構可用來建模和封裝資料: 類別記錄。 這兩種工具都可作為參考類型,但在預期用途、行為和處理相等的方式上有顯著的差異。 本指南將剖析這些差異,提供清楚的範例和實際用途,協助開發人員選擇適合他們需求的結構。 我們也將學習 IronPDF 函式庫

C# 中的類別:基礎知識

類別一直是 C# 中物件導向程式設計的基石,旨在封裝資料和行為。 它們是參考類型,意即具有相同值的兩個類別實體被視為兩個獨立的物件。 在比較兩個類別實例時,這種區別至關重要; 預設的比較是以參考為基礎,而非以價值為基礎。

public class Person
{
    public int Id { get; set; }
    public string FullName { get; set; }
}
public class Person
{
    public int Id { get; set; }
    public string FullName { get; set; }
}
$vbLabelText   $csharpLabel

在上面的範例中,Person 是一個具有 IdFullName 屬性的類別。 即使兩個 Person 實例具有相同的 IdFullName 值,它們在預設情況下也不會被視為相等,因為它們在記憶體中是兩個不同的引用。

C# 中的記錄:不可變的資料結構

記錄類型在 C# 中引入,是一種較新的新增功能,旨在簡化不可變資料結構的建立,提供傳統類別結構的強大替代方案。 與類別不同,記錄提供基於值的相等語意,使其成為資料傳輸物件或只有很少或沒有行為的小型資料結構的理想選擇。

public record Person(int Id, string FullName);
public record Person(int Id, string FullName);
$vbLabelText   $csharpLabel

在上例中,記錄定義更為簡潔,減少了模板程式碼。 記錄自動支援非破壞性突變和基於值的比較。 具有相同值的兩個記錄實例被視為相等,與值的語義一致。

實際用途:何時使用 Record 與 Class

在 C# 中選擇類別和記錄或其他資料結構,取決於您建模資料的複雜性以及應用程式所需的行為。 類別是專為複雜的資料結構所設計,可容納行為(方法),並允許所需的可變實體。 另一方面,Records 是簡單資料結構的完美範例,其設計具有不可變的特性和以值為基礎的相等性,是建立後保持不變的資料的理想選擇。

當您的資料結構需要封裝資料和行為,或是需要在資料建立後進行操作時,類別是最理想的選擇。 類的靈活性使類成為大多數傳統物件導向程式設計情境和建立複雜資料結構時的首選。

Records 在資料不變性極其重要的情況下,或是當您處理主要作為資料容器的簡單資料結構時,都會大放異彩。 這些工具內建以數值為基礎的平等性和簡潔的語法,使其成為資料傳輸物件或數值物件的絕佳選擇。

值類型和參考類型

瞭解 C# 中值類型與參考類型的差異至關重要。 類別是參考類型,意即變數持有對記憶體中實際資料的參考。 此特性導致預設的基於參考的平等比較。

記錄(Records)雖然也是參照類型,但透過其內建的基於值的相等性來模擬值語意,使其在比較中的行為有點類似於值類型。

程式碼範例:實作類和記錄。

讓我們來實作一個類別和一個記錄,以突顯語法和行為上的差異。

類別實作:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }

    public Product(int id, string name)
    {
        Id = id;
        Name = name;
    }
}
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }

    public Product(int id, string name)
    {
        Id = id;
        Name = name;
    }
}
$vbLabelText   $csharpLabel

記錄實作:

public record Product(int Id, string Name);
public record Product(int Id, string Name);
$vbLabelText   $csharpLabel

請注意記錄實作的簡潔性。 本記錄會自動產生值基相等的構造器、屬性和方法。

瞭解等式:參照與值

C# 中類和記錄類型的核心差異確實在於它們如何處理相等性:

1.類別預設使用參考相等,意即兩個實體若指向相同的記憶體位置,則相等。

2.記錄預設使用值相等,如果兩個實體的屬性具有相同的值,則視為相等。

參考等式範例 (類別)

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

var classInstance1 = new Person { Id = 1, Name = "Iron Software" };
var classInstance2 = new Person { Id = 1, Name = "Iron Software" };
Console.WriteLine(classInstance1 == classInstance2); // Outputs: False
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

var classInstance1 = new Person { Id = 1, Name = "Iron Software" };
var classInstance2 = new Person { Id = 1, Name = "Iron Software" };
Console.WriteLine(classInstance1 == classInstance2); // Outputs: False
$vbLabelText   $csharpLabel

具有相同屬性值的兩個類別實體不被視為相等,因為它們在記憶體中是不同的物件。

值相等範例

public record Person(int Id, string Name);

var recordInstance1 = new Person(1, "Iron Software");
var recordInstance2 = new Person(1, "Iron Software");
Console.WriteLine(recordInstance1 == recordInstance2); // Outputs: True
public record Person(int Id, string Name);

var recordInstance1 = new Person(1, "Iron Software");
var recordInstance2 = new Person(1, "Iron Software");
Console.WriteLine(recordInstance1 == recordInstance2); // Outputs: True
$vbLabelText   $csharpLabel

預設情況下,具有相同屬性值的記錄的兩個實例會被視為相等。

進階功能:記錄

Records 具備多項進階功能,可滿足對不可變資料結構和基於值的平等性的需求。 with 表達式允許透過複製現有記錄來建立新的記錄實體,但會修改某些屬性,以展示非破壞性的變異。

使用記錄的非破壞性突變:

var originalRecord = new Person(1, "Doe");
var modifiedRecord = originalRecord with { Name = "Iron Developer" };
var originalRecord = new Person(1, "Doe");
var modifiedRecord = originalRecord with { Name = "Iron Developer" };
$vbLabelText   $csharpLabel

此功能在處理不可變的資料結構時非常方便,因為它提供了一種"修改"實例而不會改變原始資料的方法。

IronPDF 圖書館簡介

IronPDF 網頁

IronPDF 是專為 .NET 開發人員設計的 PDF 函式庫,可直接在 .NET 應用程式中建立、編輯和管理 PDF 文件,提供全面的解決方案。 它簡化了 PDF 的產生過程,讓開發人員可以 將 HTML 轉換成 PDF、CSS、JavaScript 及圖片轉換成 PDF。 IronPDF 支援多種 .NET Framework 和專案類型,包括網頁、桌面和主控台應用程式,可跨 Windows、Linux 和 macOS 等多種作業系統。

除 PDF 創建外,IronPDF 還提供編輯 PDF、設定屬性和安全性、處理 PDF 表單以及提取內容等功能。 它旨在滿足那些正在尋找可靠工具將 PDF 功能整合到其 .NET 專案中的開發人員的需求。

程式碼範例

使用 IronPDF 在 C# 中創建 PDF 可以通過類別和記錄兩種方式實現。 以下是兩種方法產生簡單 PDF 文件的範例。 C# 中類和記錄的主要差異在於它們的預期用途:類預設是可變的,專為傳統的物件導向程式設計,而記錄是不可變的,專為以值為基礎的程式設計,因此非常適合資料建模。

使用類別

在這個範例中,我們將定義一個 PdfGenerator 類,其中包含一個從給定的 HTML 字串建立 PDF 的方法。

using IronPdf;
using System;

public class PdfGenerator
{
    public string HtmlContent { get; set; }

    public PdfGenerator(string htmlContent)
    {
        HtmlContent = htmlContent;
    }

    public void GeneratePdf(string filePath)
    {
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(HtmlContent);
        pdfDocument.SaveAs(filePath);
    }
}

class Program
{
    public static void Main(string[] args)
    {
        License.LicenseKey = "License-Key"; // Set your license key here

        var generator = new PdfGenerator("<h1>Hello, World from Class!</h1>");
        generator.GeneratePdf("ClassExample.pdf");
    }
}
using IronPdf;
using System;

public class PdfGenerator
{
    public string HtmlContent { get; set; }

    public PdfGenerator(string htmlContent)
    {
        HtmlContent = htmlContent;
    }

    public void GeneratePdf(string filePath)
    {
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(HtmlContent);
        pdfDocument.SaveAs(filePath);
    }
}

class Program
{
    public static void Main(string[] args)
    {
        License.LicenseKey = "License-Key"; // Set your license key here

        var generator = new PdfGenerator("<h1>Hello, World from Class!</h1>");
        generator.GeneratePdf("ClassExample.pdf");
    }
}
$vbLabelText   $csharpLabel

輸出:

 類別範例輸出的 PDF

使用記錄

相比之下,C# 中的記錄在初始化後是不可變的。 以下是您如何利用 with 表達式來修改記錄,以達到類似的結果,此表達式基本上會返回一個具有所需變更的記錄新實例。

using IronPdf;
using System;

public record PdfGeneratorRecord(string HtmlContent)
{
    public void GeneratePdf(string filePath)
    {
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(this.HtmlContent);
        pdfDocument.SaveAs(filePath);
    }
}

class Program
{
    public static void Main(string[] args)
    {
        License.LicenseKey = "License-Key"; // Set your license key here

        var recordGenerator = new PdfGeneratorRecord("<h1>Hello, World from Record!</h1>");
        recordGenerator.GeneratePdf("RecordExample.pdf");
    }
}
using IronPdf;
using System;

public record PdfGeneratorRecord(string HtmlContent)
{
    public void GeneratePdf(string filePath)
    {
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(this.HtmlContent);
        pdfDocument.SaveAs(filePath);
    }
}

class Program
{
    public static void Main(string[] args)
    {
        License.LicenseKey = "License-Key"; // Set your license key here

        var recordGenerator = new PdfGeneratorRecord("<h1>Hello, World from Record!</h1>");
        recordGenerator.GeneratePdf("RecordExample.pdf");
    }
}
$vbLabelText   $csharpLabel

輸出:

 從記錄範例輸出 PDF

這些範例說明如何使用 IronPDF 以 C# 語言同時使用類別和記錄產生 PDF 檔案。 選擇使用類別或記錄取決於您的特定需求:如果您需要的物件在建立後會被修改,類別可能會比較適合。 如果您要處理的資料一旦建立就不應該改變,或者您欣賞語法上的簡單性及不可變性的安全性,記錄可能是更好的選擇。

結論

IronPDF 授權頁面

總而言之,類別提供了傳統的物件導向功能,具有可變狀態和基於參照的相等性,而記錄則提供了現代的方法,以定義基於值的相等性的不可變資料結構。

在使用類別或記錄之間作出選擇時,應以您應用程式的特定需求為導向,並考慮各種因素,例如對不可變性的需求、資料結構的複雜性,以及優先使用的相等性比較方法。 發現 IronPDF 的免費試用版,適合希望將 PDF 功能整合至 .NET 應用程式的使用者,授權費從 $799 起。

常見問題解答

C# 類別和記錄的主要差異是什麼?

C# 類別和記錄都是用於建模和封裝資料的參考類型,但它們在處理相等性和不可變性方面有所不同。類別使用引用相等性,這意味著如果兩個實例指向相同的記憶體位置,則它們被認為是相等的。另一方面,記錄使用值相等性,如果兩個實例的屬性值相同,則它們被認為是相等的,並且預設是不可變的。

在 C# 中,如何決定使用類別還是記錄?

在 C# 中,使用類別還是記錄取決於您的特定需求。如果您需要可變實例或希望封裝物件導向程式設計中常見的資料和行為,請使用類別。如果您的資料結構簡單、不可變,並且需要基於值的相等性(例如資料傳輸物件),則應選擇記錄。

IronPDF 庫如何在 .NET 中支援 PDF 生成?

IronPDF 是一個功能強大的 .NET PDF 庫,它簡化了 PDF 文件的建立、編輯和管理。它允許開發人員將 HTML、CSS、JavaScript 和映像轉換為 PDF,支援各種 .NET 框架和作業系統,使其成為 .NET 開發人員的必備工具。

我可以在 PDF 生成專案中同時使用 C# 類別和記錄嗎?

是的,C# 類別和記錄都可以用於 PDF 產生專案。具體選擇取決於您的邏輯需要可變資料結構還是不可變資料結構。例如,IronPDF 可以無縫地與這兩種結構配合使用,產生和操作 PDF 文件。

C# 記錄中不可變性扮演什麼角色?

不可變性是 C# 記錄的核心特性。記錄一旦創建,其屬性就無法更改,這與基於值的相等語義相一致。這種設計使得記錄非常適合資料一致性和完整性至關重要的場景,例如資料傳輸物件。

IronPDF 如何增強 .NET 應用程式的 PDF 功能?

IronPDF 透過提供 HTML 轉 PDF、PDF 編輯和文件安全管理等功能,增強了 .NET 應用程式的 PDF 功能。它支援表單操作、內容提取,並可無縫整合到不同的 .NET 環境中,從而簡化 PDF 文件處理流程。

在 C# 記錄上下文中,「with」表達式是什麼意思?

C# 記錄中的「with」表達式用於非破壞性修改。它允許開發人員透過複製現有記錄實例並修改其某些屬性來建立新的記錄實例,從而確保原始資料保持不變。

為什麼記錄被認為是適合作為資料傳輸物件?

記錄之所以被認為是資料傳輸物件的理想選擇,是因為它們提供了一種簡潔的語法來定義基於值的不可變結構。這確保了資料完整性,並將具有相同值的實例視為相等,這在資料傳輸場景中通常是理想的。

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

Jacob Mellor 是 Iron Software 的首席技術官,也是一位富有遠見的工程師,率先開發了 C# PDF 技術。作為 Iron Software 核心程式碼庫的最初開發者,他自公司成立之初便參與塑造了其產品架構,並與執行長 Cameron Rimington 一起將其發展成為一家擁有 50 多名員工、服務於 NASA、特斯拉和全球政府機構的公司。

Jacob 於 1998 年至 2001 年在曼徹斯特大學獲得土木工程一級榮譽學士學位。 1999 年,他在倫敦創辦了自己的第一家軟體公司;2005 年,他創建了自己的第一個 .NET 元件。此後,他專注於解決微軟生態系統中的複雜問題。

他的旗艦產品 IronPDF 和 IronSuite .NET 庫在全球 NuGet 上的安裝量已超過 3000 萬次,其基礎程式碼持續為全球開發者工具提供支援。憑藉 25 年的商業經驗和 41 年的程式設計專長,Jacob 始終致力於推動企業級 C#、Java 和 Python PDF 技術的創新,同時指導下一代技術領導者。