跳過到頁腳內容
.NET幫助

C# Record Vs Class(對於開發者的運行原理)

在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

在上述例子中,記錄定義更為簡潔,減少了樣板代碼。 記錄自動支持不破壞性的變異和基於值的比較。 具有相同值的兩個記錄實例被認為是相等的,這與值語義一致。

實際用途:何時使用記錄與類別

在C#中選擇類別、記錄或其他數據結構取決於您所建模的數據的複雜性及應用程序要求的行為。 類別專為複雜數據結構設計,容納行為(方法)並允許隨需求改變的可變實例。 另一方面,記錄是具有不可變特性和基於值的等價性的簡單數據結構的完美例子,理想用於創建後保持不變的數據。

當您的數據結構需要封裝數據和行為或需要在創建後操縱數據時,類別是理想選擇。 這種彈性使類別成為大多數傳統面向物件編程場景以及創建複雜數據結構的首選。

在數據不可變性至關重要或主要作為數據容器的簡單數據結構場景中,記錄大放異彩。 它們內置的基於值的等價性和簡潔語法使其成為數據傳輸對象或值對象的絕佳選擇。

值類型和參考類型

了解C#中值類型和參考類型之間的區別至關重要。 類別是參考類型,這意味著變量持有指向內存中實際數據的引用。 這一特性導致默認是基於參考的等價性比較。

記錄雖然也是參考類型,但透過內建的基於值的等價性模擬值語義,使其在比較中有點像值類型。

程式碼例子:實施類別和記錄

讓我們實施類別和記錄來突出語法和行為上的差異。

類別實施:

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

注意記錄實施的簡潔性和簡單性。 記錄自動生成構造函數、屬性和基於值的等價性的函數。

理解等價性:參考 vs 值

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

具有相同屬性值的兩個記錄實例默認情況下是相等的。

高級功能:記錄

記錄具有多種高級功能,滿足了對不可變數據結構和基於值的等價性的需求。 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文件。 透過允許開發者將HTML轉換為PDF、CSS、JavaScript和圖像轉換為PDF,它簡化了PDF生成過程。 IronPDF支持多種.NET框架和項目類型,包括Web、桌面和控制台應用程序,跨越多個操作系統如Windows、Linux和macOS。

除了PDF創建之外,IronPDF還提供編輯PDF、設置屬性和安全性、處理PDF表單和提取內容的能力。 它旨在滿足尋求可靠工具來將PDF功能整合到其.NET項目的開發者的需求。

程式碼範例

使用IronPDF在C#中創建PDF可以透過類別和記錄來實現。 以下是使用兩種方法生成簡單PDF文件的例子。 C#中類別和記錄的主要區別在於其預期用途:類別默認是可變的並為傳統面向對象編程設計,而記錄是不可變的,為基於值的編程設計,是數據建模的理想選擇。

使用類別

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

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 Framework和操作系統,是 .NET 開發者的必備工具。

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

是的,在 PDF 生成項目中可以同時使用 C# 類別和記錄。選擇取決於您是否需要可變或不可變的數據結構。比如,IronPDF 可以與這兩種類型的結構順利協作來生成和操作 PDFs。

不可變性在 C# 記錄中發揮了什麼作用?

不可變性是 C# 記錄的核心特性。一旦創建,記錄的屬性就不能更改,符合基於值的相等語義。這一設計使記錄在需要數據一致性和完整性的情況下(如在數據傳輸對象中)成為理想選擇。

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

IronPDF 通過提供將 HTML 轉換為 PDF、編輯 PDF 和管理文檔安全性的功能來增強 .NET 應用程序的 PDF 功能。它支持表單處理、內容提取,並無縫集成不同的 .NET 環境,從而簡化 PDF 文檔處理。

'with' 表達式在 C# 記錄中的作用是什麼?

'with' 表達式在 C# 記錄中用於非破壞性變更。它允許開發者通過複製現有的記錄實例並修改某些屬性來創建新的記錄實例,確保原始數據保持不變。

為什麼記錄被認為適合用於數據傳輸對象?

記錄被認為適合用於數據傳輸對象,因為它們提供了定義不可變結構的簡潔語法,具有基於值的相等性。這確保了數據完整性和具有相同值的實例被視為相等,這在數據傳輸中通常是期望的。

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