.NET 幫助

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

在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
$vbLabelText   $csharpLabel

在上面的範例中,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)
$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;
    }
}
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
$vbLabelText   $csharpLabel

記錄實現:

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)
$vbLabelText   $csharpLabel

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

理解相等性:引用 vs. 值

C# 中 class 類型和 record 類型的核心區別確實在於它們如何處理相等性:

  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
$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
'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
$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" };
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" }
$vbLabelText   $csharpLabel

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

IronPDF 庫介紹

IronPDF 網頁

IronPDF 是專為 .NET 開發人員設計的 PDF 函式庫,提供完整的解決方案,可直接在 .NET 應用程式中建立、編輯及管理 PDF 文件。 它簡化了 PDF 生成過程,允許開發人員將 HTML 轉換成 PDF,以及將 CSS、JavaScript 和圖像轉換成 PDF。 IronPDF 支援各種 .NET 框架和專案類型,包括網頁、桌面和控制台應用程式,適用於多個操作系統,如 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
$vbLabelText   $csharpLabel

輸出:

從類別範例輸出的 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
$vbLabelText   $csharpLabel

輸出:

來自紀錄範例的輸出PDF

這些示例說明如何使用 IronPDF 結合類別和記錄在 C# 中生成 PDF 文件。 在選擇使用類別或記錄時,需要根據您的具體需求進行選擇:如果您需要創建後將會被修改的對象,類別可能更合適。 如果您處理的是應在創建後不改變的數據,或者您欣賞不可變性的語法簡單性和安全性,則紀錄可能是更好的選擇。

結論

IronPDF 授權頁面

總結而言,類別提供傳統的面向對象特性,具有可變狀態和基於參考的相等性,而記錄提供了一種現代方法來定義具有基於值相等性的不可變數據結構。

在選擇使用類別或記錄時,應根據應用程式的具體需求來決定,考量的因素包括是否需要不可變性、資料結構的複雜性以及首選的等值比較方法。 探索 IronPDF 的免費試用版,適用於希望將 PDF 功能整合到其 .NET 應用程式中的人員,授權價格從 $749 起。

Chipego
奇佩戈·卡林达
軟體工程師
Chipego 擁有天生的傾聽技能,這幫助他理解客戶問題,並提供智能解決方案。他在獲得信息技術理學學士學位後,于 2023 年加入 Iron Software 團隊。IronPDF 和 IronOCR 是 Chipego 專注的兩個產品,但隨著他每天找到新的方法來支持客戶,他對所有產品的了解也在不斷增長。他喜歡在 Iron Software 的協作生活,公司內的團隊成員從各自不同的經歷中共同努力,創造出有效的創新解決方案。當 Chipego 離開辦公桌時,他常常享受讀好書或踢足球的樂趣。
< 上一頁
C# 睡眠 (開發人員如何使用)
下一個 >
MySqlclient C#(開發人員如何使用)