.NET 幫助

C# 記錄與類別 (開發人員運作方式)

發佈 2024年8月11日
分享:

在 C# 的世界中,有兩種主要結構用於建模和封裝數據: 類別記錄兩者都作為參考類型,但在其預定用途、行為以及處理相等性方面有很大差異。本指南將剖析這些差異,提供明確的示例和實際用途,以幫助開發人員選擇適合其需求的結構。我們還將了解 IronPDF library.

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; }
}
Public Class Person
	Public Property Id() As Integer
	Public Property FullName() As String
End Class
VB   C#

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

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

在 C# 中,引入的記錄類型是一個較新的補充,旨在簡化不可變資料結構的創建,提供了一個傳統類別結構的強大替代方案。與類別不同,記錄提供基於值的等號語義,這使其成為資料傳輸對象或具有很少或沒有行為的小型資料結構的理想選擇。

public record Person(int Id, string FullName);
public record Person(int Id, string FullName);
'INSTANT VB TODO TASK: C# 'records' are not converted by Instant VB:
'public record Person(int Id, string FullName)
VB   C#

在上述範例中,記錄定義更加簡潔,減少了樣板代碼。 記錄自動支援非破壞性修改和基於值的比較。 具有相同值的兩個記錄實例被視為相等,符合值語義。

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

選擇使用 Class 還是 Record 或其他數據結構取決於您在 C# 中所建模的數據的複雜性以及您的應用程序所需的行為。Classes 專門設計用於複雜的數據結構,能夠容納行為。 (方法) 並允許在需要時進行可變實例。然而,Records 是一個簡單數據結構的完美範例,設計具有不可變的特性和基於數值的相等性,適合在創建後不變的數據。

當您的數據結構需要封裝數據和行為或在創建數據後需要操作數據時,Classes 是理想的選擇。這種靈活性使得 classes 成為大多數傳統面向對象編程場景和創建複雜數據結構時的首選。

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;
    }
}
Public Class Product
	Public Property Id() As Integer
	Public Property Name() As String

	Public Sub New(ByVal id As Integer, ByVal name As String)
		Me.Id = id
		Me.Name = name
	End Sub
End Class
VB   C#

記錄實作:

public record Product(int Id, string Name);
public record Product(int Id, string Name);
'INSTANT VB TODO TASK: C# 'records' are not converted by Instant VB:
'public record Product(int Id, string Name)
VB   C#

注意此記錄實作的簡潔性和簡單性。記錄會自動生成構造函數、屬性和基於值的相等性方法。

理解相等性:引用與值

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
Public Class Person
	Public Property Id() As Integer
	Public Property Name() As String
End Class

Private classInstance1 = New Person With {
	.Id = 1,
	.Name = "Iron Software"
}
Private classInstance2 = New Person With {
	.Id = 1,
	.Name = "Iron Software"
}
Console.WriteLine(classInstance1 = classInstance2) ' Outputs: False
VB   C#

類別的兩個實例具有相同的屬性值,並不被認為是相等的,因為它們在記憶體中是不同的對象。

值相等範例

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
'INSTANT VB TODO TASK: C# 'records' are not converted by Instant VB:
'public record Person(int Id, string Name)

Private recordInstance1 = New Person(1, "Iron Software")
Private recordInstance2 = New Person(1, "Iron Software")
Console.WriteLine(recordInstance1 = recordInstance2) ' Outputs: True
VB   C#

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

進階功能:記錄

記錄具有多項進階功能,滿足不可變數據結構和基於值的等值需求。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" };
Dim originalRecord = New Person(1, "Doe")
'INSTANT VB TODO TASK: C# 'with expressions' are not converted by Instant VB:
'var modifiedRecord = originalRecord with { Name = "Iron Developer" }
VB   C#

當處理不可變資料結構時,此功能非常方便,因為它提供了一種在不更改原始資料的情況下“修改”實例的方法。

IronPDF 庫簡介

IronPDF 網頁

IronPDF 是一個為 .NET 開發者提供的 PDF 程式庫,提供創建、編輯和管理 PDF 文件的全面解決方案,直接在 .NET 應用程式中使用。它通過讓開發者可以簡化 PDF 生成過程。 轉換HTML, CSS、JavaScript 和圖像轉換為 PDF。IronPDF 支援各種 .NET 框架和項目類型,包括 Web 應用程序、桌面應用程序和控制台應用程序,適用於多個操作系統,如 Windows、Linux 和 macOS。

除了 PDF 創建功能,IronPDF 還提供編輯 PDF、設置屬性和安全性、操作 PDF 表單和提取內容的功能。它旨在滿足開發人員尋求穩定工具將 PDF 功能集成到其 .NET 項目中的需求。

代碼範例

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

使用類別

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

using IronPdf;

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";

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

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";

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

Public Class PdfGenerator
	Public Property HtmlContent() As String

	Public Sub New(ByVal htmlContent As String)
		Me.HtmlContent = htmlContent
	End Sub

	Public Sub GeneratePdf(ByVal filePath As String)
		Dim renderer = New ChromePdfRenderer()
		Dim pdfDocument = renderer.RenderHtmlAsPdf(HtmlContent)
		pdfDocument.SaveAs(filePath)
	End Sub
End Class

Friend Class Program
	Public Shared Sub Main(ByVal args() As String)
		License.LicenseKey = "License-Key"

		Dim generator = New PdfGenerator("<h1>Hello, World from Class!</h1>")
		generator.GeneratePdf("ClassExample.pdf")
	End Sub
End Class
VB   C#

輸出:

從類別範例輸出的 PDF

使用記錄

相反地,C# 中的記錄在初始化後是不可變的。這裡展示了如何通過記錄實現類似效果,利用 with 表達式進行修改,這基本上會返回具有所需更改的記錄的新實例。

using IronPdf;

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";

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

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";

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

'INSTANT VB TODO TASK: C# 'records' are not converted by Instant VB:
'public record PdfGeneratorRecord(string HtmlContent)
'{
'	public void GeneratePdf(string filePath)
'	{
'		var renderer = New ChromePdfRenderer();
'		var pdfDocument = renderer.RenderHtmlAsPdf(Me.HtmlContent);
'		pdfDocument.SaveAs(filePath);
'	}
'}

Friend Class Program
	Public Shared Sub Main(ByVal args() As String)
		License.LicenseKey = "License-Key"

		Dim recordGenerator = New PdfGeneratorRecord("<h1>Hello, World from Record!</h1>")
		recordGenerator.GeneratePdf("RecordExample.pdf")
	End Sub
End Class
VB   C#

輸出:

從記錄示例輸出的 PDF

以下範例說明如何使用IronPDF在C#中生成PDF文件,無論是使用類還是記錄。選擇使用類或記錄取決於您的具體需求:如果您需要在創建後會被修改的對象,類可能更適合。如果您正在處理創建後不應更改的數據,或者您欣賞不可變更性的語法簡潔和安全,記錄可能是更好的選擇。

結論

IronPDF 授權頁面

總結來說,類別提供了具有可變狀態和基於引用的等同性的傳統物件導向特徵,而記錄則提供了一種定義不可變數據結構且基於值的等同性的現代方法。

在使用類別或記錄之間的選擇應由您的應用程式的具體需求來指導,考慮到需要不可變性、數據結構的複雜性以及首選的等同性比較方法等因素。 IronPDF 提供一個 免費試用 對於那些希望將 PDF 功能整合到他們的 .NET 應用程式中的人,授權起價為 $749。

< 上一頁
C# 睡眠 (開發人員如何使用)
下一個 >
MySqlclient C#(開發人員如何使用)

準備開始了嗎? 版本: 2024.10 剛剛發布

免費 NuGet 下載 總下載次數: 10,993,239 查看許可證 >