
C# Record vs Class (Funktionsweise für Entwickler)
In der Welt von C# werden zwei primäre Strukturen zur Modellierung und Kapselung von Daten genutzt: Klassen und Records. Beide dienen als Referenztypen, unterscheiden sich jedoch erheblich in ihrer beabsichtigten Verwendung, ihrem Verhalten und der Art und Weise, wie sie Gleichheit behandeln. Dieser Leitfaden wird diese Unterschiede aufschlüsseln und klare Beispiele und praktische Anwendungsfälle zur Unterstützung von Entwicklern bei der Auswahl der richtigen Struktur für ihre Bedürfnisse bieten. Wir werden auch die IronPDF-Bibliothek kennenlernen.
Klassen in C#: Die Grundlagen
Klassen sind ein Grundpfeiler der objektorientierten Programmierung in C#, entworfen zur Kapselung von Daten und Verhalten. Sie sind Referenztypen, was bedeutet, dass zwei Instanzen derselben Klasse mit denselben Werten als zwei getrennte Objekte betrachtet werden. Diese Unterscheidung ist entscheidend, wenn man zwei Klasseninstanzen miteinander vergleicht; der Standardvergleich basiert auf Referenzen, nicht auf Werten.
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 ClassIm obigen Beispiel ist Person eine Klasse mit den Eigenschaften Id und FullName. Selbst wenn zwei Person-Instanzen identische Id- und FullName-Werte haben, werden sie standardmäßig nicht als gleich angesehen, weil sie zwei unterschiedliche Referenzen im Arbeitsspeicher sind.
Aufzeichnungen in C#: Unveränderliche Datenstrukturen
Eingeführt in C#, ist der Record-Typ eine neuere Ergänzung, die darauf abzielt, die Erstellung unveränderlicher Datenstrukturen zu vereinfachen und eine robuste Alternative zu traditionellen Klassenstrukturen zu bieten. Im Gegensatz zu Klassen bieten Records wertbasierte Gleichheitssemantik, was sie ideal für Datenübertragungsobjekte oder kleine Datenstrukturen mit wenig oder keinem Verhalten macht.
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)Im obigen Beispiel ist die Record-Definition prägnanter, was den Boilerplate-Code reduziert. Records unterstützen automatisch nicht-destruktive Mutation und wertbasierten Vergleich. Zwei Record-Instanzen mit denselben Werten werden als gleich angesehen, was den Wertsemantiken entspricht.
Praktische Verwendungen: Wann sollte man Record vs. Class verwenden
Die Wahl zwischen einer Klasse und einem Record oder anderen Datenstrukturen in C# hängt von der Komplexität der Daten, die Sie modellieren, und den Verhaltensanforderungen Ihrer Anwendung ab. Klassen sind speziell für komplexe Datenstrukturen entworfen, die Verhaltensweisen (Methoden) beherbergen und veränderliche Instanzen nach Bedarf zulassen. Records hingegen sind perfekte Beispiele für eine einfache Datenstruktur, die mit unveränderlichen Merkmalen und wertbasierter Gleichheit entworfen wurde, ideal für Daten, die nach der Erstellung konstant bleiben.
Klassen sind ideal, wenn Ihre Datenstruktur die Kapselung von Daten und Verhaltensweisen erfordert oder wenn Sie die Daten nach deren Erstellung manipulieren müssen. Diese Flexibilität macht Klassen zur ersten Wahl für die meisten traditionellen objektorientierten Programmierungsszenarien und bei der Erstellung komplexer Datenstrukturen.
Datensätze glänzen in Szenarien, in denen Datenunveränderlichkeit entscheidend ist oder wenn Sie es mit einfachen Datenstrukturen zu tun haben, die hauptsächlich als Datenspeicher dienen. Ihre eingebaute wertbasierte Gleichheit und Konzeptsprache machen sie hervorragend für Datenübertragungsobjekte oder Wertobjekte.
Werttypen und Referenztypen
Das Verständnis des Unterschieds zwischen Werttyp und Referenztyp in C# ist entscheidend. Klassen sind Referenztypen, was bedeutet, dass Variablen eine Referenz auf die tatsächlichen Daten im Speicher halten. Diese Eigenschaft führt zum Standardvergleich der Referenzen.
Records, obwohl sie auch Referenztypen sind, emulieren Wertsemantiken durch ihre eingebaute wertbasierte Gleichheit, was sie bei Vergleichen ähnlich wie Werttypen agieren lässt.
Code-Beispiele: Implementieren von Klassen und Datensätzen
Lassen Sie uns eine Klasse und ein Record implementieren, um die Unterschiede in Syntax und Verhalten hervorzuheben.
Klassenimplementierung:
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 ClassRecord-Implementierung:
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)Beachten Sie die Kürze und Einfachheit der Record-Implementierung. Das Record generiert automatisch den Konstruktor, die Eigenschaften und Methoden für wertbasierte Gleichheit.
Gleichheit verstehen: Referenz vs. Wert
Der wesentliche Unterschied zwischen Klassen- und Record-Typen in C# liegt tatsächlich darin, wie sie Gleichheit behandeln:
-
Klassen verwenden standardmäßig Referenzgleichheit, was bedeutet, dass zwei Instanzen gleich sind, wenn sie auf denselben Speicherort zeigen.
-
Records verwenden standardmäßig Wertgleichheit und betrachten zwei Instanzen als gleich, wenn ihre Eigenschaften die gleichen Werte haben.
Beispiel zur Referenzgleichheit (Klasse)
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: FalsePublic 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: FalseZwei Instanzen einer Klasse mit denselben Eigenschaftswerten werden nicht als gleich betrachtet, da sie unterschiedliche Objekte im Speicher sind.
Beispiel zur Wertgleichheit
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: TrueZwei Instanzen eines Records mit denselben Eigenschaftswerten werden standardmäßig als gleich angesehen.
Erweiterte Funktionen: Datensätze
Records kommen mit mehreren erweiterten Funktionen, die die Bedürfnisse nach unveränderlichen Datenstrukturen und wertbasierter Gleichheit erfüllen. Der with-Ausdruck ermöglicht die Erstellung einer neuen Record-Instanz durch das Kopieren eines bestehenden Records, jedoch mit einigen geänderten Eigenschaften, was eine nicht-destruktive Mutation demonstriert.
Nicht-destruktive Mutation mit Records:
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" }Dieses Merkmal ist nützlich, wenn man mit unveränderlichen Datenstrukturen arbeitet, da es eine Möglichkeit bietet, eine Instanz zu 'modifizieren', ohne die ursprünglichen Daten zu ändern.
Einführung in die IronPDF-Bibliothek

IronPDF ist eine PDF-Bibliothek für .NET-Entwickler und bietet eine umfassende Lösung zum Erstellen, Bearbeiten und Verwalten von PDF-Dokumenten direkt innerhalb von .NET-Anwendungen. Es vereinfacht den PDF-Erstellungsprozess, indem Entwickler HTML in PDFs umwandeln, CSS, JavaScript und Bilder in PDFs umwandeln können. IronPDF unterstützt eine Vielzahl von .NET-Frameworks und Projekttypen, einschließlich Web-, Desktop- und Konsolenanwendungen, für mehrere Betriebssysteme wie Windows, Linux und macOS.
Neben der PDF-Erstellung bietet IronPDF Funktionen zum Bearbeiten von PDFs, Festlegen von Eigenschaften und Sicherheit, Arbeiten mit PDF-Formularen und Extrahieren von Inhalten. Es ist darauf ausgelegt, die Bedürfnisse von Entwicklern zu erfüllen, die nach einem zuverlässigen Werkzeug suchen, um PDF-Funktionalität in ihre .NET-Projekte zu integrieren.
Codebeispiel
Ein PDF in C# mit IronPDF zu erstellen, kann sowohl mit Klassen als auch mit Records erreicht werden. Im Folgenden finden Sie Beispiele für beide Ansätze zur Erstellung eines einfachen PDF-Dokuments. Der Hauptunterschied zwischen Klassen und Records in C# liegt in ihrer beabsichtigten Verwendung: Klassen sind standardmäßig veränderlich und für die traditionelle objektorientierte Programmierung ausgelegt, während Records unveränderlich und für wertbasierte Programmierung ausgelegt sind, was sie ideal für Datenmodellierung macht.
Verwendung einer Klasse
In diesem Beispiel definieren wir eine PdfGenerator-Klasse, die eine Methode enthält, um ein PDF aus einem gegebenen HTML-String zu erstellen.
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");
}
}Imports IronPdf
Imports System
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" ' Set your license key here
Dim generator = New PdfGenerator("<h1>Hello, World from Class!</h1>")
generator.GeneratePdf("ClassExample.pdf")
End Sub
End ClassAusgabe:

Verwendung eines Datensatzes
Im Gegensatz dazu ist ein Record in C# nach der Initialisierung unveränderlich. So können Sie mit einem Datensatz ein ähnliches Ergebnis erzielen, indem Sie with-Ausdrücke für Modifikationen nutzen, die im Wesentlichen eine neue Instanz des Datensatzes mit den gewünschten Änderungen zurückgeben.
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");
}
}Imports IronPdf
Imports System
'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" ' Set your license key here
Dim recordGenerator = New PdfGeneratorRecord("<h1>Hello, World from Record!</h1>")
recordGenerator.GeneratePdf("RecordExample.pdf")
End Sub
End ClassAusgabe:

Diese Beispiele veranschaulichen, wie man mit IronPDF sowohl mit einer Klasse als auch einem Record in C# eine PDF-Datei erstellt. Die Entscheidung zwischen der Verwendung einer Klasse oder eines Records hängt von Ihren spezifischen Bedürfnissen ab: Wenn Sie Objekte benötigen, die nach ihrer Erstellung modifiziert werden sollen, könnte eine Klasse geeigneter sein. Wenn Sie es mit Daten zu tun haben, die sich nach der Erstellung nicht ändern sollen, oder wenn Sie die syntaktische Einfachheit und Sicherheit der Unveränderlichkeit schätzen, könnte ein Record die bessere Wahl sein.
Abschluss
Abschließend bieten Klassen traditionelle objektorientierte Funktionen mit veränderlichem Zustand und referenzbasierter Gleichheit, während Records einen modernen Ansatz zur Definition unveränderlicher Datenstrukturen mit wertbasierter Gleichheit bieten.
Die Wahl zwischen der Verwendung einer Klasse oder eines Records sollte durch die spezifischen Anforderungen Ihrer Anwendung geleitet werden, wobei Faktoren wie die Notwendigkeit von Unveränderlichkeit, die Komplexität der Datenstruktur und die bevorzugte Methode zum Vergleich der Gleichheit zu berücksichtigen sind. Entdecken Sie die kostenlose Testversion von IronPDF für diejenigen, die PDF-Funktionalität in ihre .NET-Anwendungen integrieren möchten, mit Lizenzen ab $999.

Jacob Mellor ist Chief Technology Officer bei Iron Software und ein visionärer Ingenieur, der Pionierarbeit in der C# PDF-Technologie leistet. Als der ursprüngliche Entwickler hinter der Kern-Codebasis von Iron Software hat er die Produktarchitektur des Unternehmens seit seiner Gründung geprägt und es zusammen mit CEO Cameron Rimington in ein Unternehmen mit mehr als 50 Mitarbeitern verwandelt, das die NASA, Tesla und globale Regierungsbehörden beliefert.
Verwandte Artikel


