Test in einer Live-Umgebung
Test in der Produktion ohne Wasserzeichen.
Funktioniert überall, wo Sie es brauchen.
In der Welt von C# werden zwei primäre Strukturen verwendet, um Daten zu modellieren und zu kapseln: Klassen und *Rekorde. Beide dienen als Referenztypen, unterscheiden sich aber erheblich in ihrem Verwendungszweck, ihrem Verhalten und ihrer Handhabung der Gleichheit. In diesem Leitfaden werden diese Unterschiede anhand von klaren Beispielen und praktischen Anwendungen aufgeschlüsselt, um Entwicklern bei der Wahl der richtigen Struktur für ihre Bedürfnisse zu helfen. Wir werden auch etwas über die IronPDF-Bibliothek.
Klassen sind ein Eckpfeiler der objektorientierten Programmierung in C# und wurden entwickelt, um Daten und Verhalten zu kapseln. Sie sind Referenztypen, d. h. zwei Klasseninstanzen mit denselben Werten werden als zwei separate Objekte betrachtet. Diese Unterscheidung ist entscheidend, wenn zwei Klasseninstanzen verglichen werden; der Standardvergleich ist referenzbasiert, nicht wertbasiert.
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
Im 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, da es sich um zwei unterschiedliche Referenzen im Speicher handelt.
Der in C# eingeführte Record-Typ ist eine neuere Ergänzung, die die Erstellung unveränderlicher Datenstrukturen vereinfachen soll und eine robuste Alternative zu traditionellen Klassenstrukturen darstellt. Im Gegensatz zu Klassen bieten Datensätze eine wertbasierte Gleichheitssemantik, was sie ideal für Datenübertragungsobjekte oder kleine Datenstrukturen mit wenig oder gar keinem Verhalten macht.
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)
Im obigen Beispiel ist die Datensatzdefinition prägnanter, wodurch sich der Kesselsteincode reduziert. Datensätze unterstützen automatisch eine zerstörungsfreie Mutation und einen wertbasierten Vergleich. Zwei Datensatzinstanzen mit denselben Werten werden als gleich angesehen, was der Wertesemantik entspricht.
Die Wahl zwischen einer Klasse und einem Datensatz oder anderen Datenstrukturen in C# hängt von der Komplexität der Daten ab, die Sie modellieren, und von den Verhaltensweisen, die für Ihre Anwendung erforderlich sind. Klassen sind speziell für komplexe Datenstrukturen konzipiert, die Verhaltensweisen berücksichtigen (methoden) und bei Bedarf veränderbare Instanzen zuzulassen. Datensätze hingegen sind perfekte Beispiele für eine einfache Datenstruktur mit unveränderlichen Merkmalen und wertbasierter Gleichheit, 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 ihrer Erstellung manipulieren müssen. Diese Flexibilität macht Klassen zur ersten Wahl für die meisten traditionellen objektorientierten Programmierszenarien und für die Erstellung komplexer Datenstrukturen.
Datensätze eignen sich hervorragend für Szenarien, in denen die Unveränderlichkeit von Daten entscheidend ist oder wenn Sie mit einfachen Datenstrukturen arbeiten, die in erster Linie als Datencontainer dienen. Durch ihre eingebaute wertbasierte Gleichheit und ihre prägnante Syntax eignen sie sich hervorragend für Datenübertragungsobjekte oder Wertobjekte.
Es ist wichtig, den Unterschied zwischen Werttyp und Referenztyp in C# zu verstehen. Klassen sind Referenztypen, d. h. Variablen enthalten einen Verweis auf die tatsächlichen Daten im Speicher. Dieses Merkmal führt zu dem standardmäßigen referenzbasierten Gleichheitsvergleich.
Datensätze sind zwar auch Referenztypen, emulieren aber die Semantik von Werten durch ihre eingebaute wertbasierte Gleichheit, wodurch sie sich bei Vergleichen in gewisser Weise wie Werttypen verhalten.
Lassen Sie uns eine Klasse und einen Datensatz implementieren, um die Unterschiede in Syntax und Verhalten zu verdeutlichen.
Klasseneinführung:
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
Durchführung der Aufzeichnungen:
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)
Beachten Sie die Kürze und Einfachheit der Implementierung des Datensatzes. Der Datensatz generiert automatisch den Konstruktor, die Eigenschaften und die Methoden für die wertbasierte Gleichheit.
Der Hauptunterschied zwischen Klassen- und Datensatztypen in C# liegt in der Tat darin, wie sie mit Gleichheit umgehen:
Klassen verwenden standardmäßig Referenzgleichheit, d. h. zwei Instanzen sind gleich, wenn sie auf denselben Speicherplatz zeigen.
Datensätze verwenden standardmäßig Wertgleichheit, d. h. zwei Instanzen werden als gleich angesehen, wenn ihre Eigenschaften die gleichen Werte haben.
Beispiel für die Gleichstellung (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: 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
Zwei Instanzen einer Klasse mit denselben Eigenschaftswerten werden nicht als gleich angesehen, da sie unterschiedliche Objekte im Speicher sind.
Beispiel für die 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
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
Zwei Instanzen eines Datensatzes mit denselben Eigenschaftswerten werden standardmäßig als gleich angesehen.
Datensätze verfügen über mehrere erweiterte Funktionen, die dem Bedarf an unveränderlichen Datenstrukturen und wertbasierter Gleichheit gerecht werden. Der Ausdruck mit ermöglicht die Erstellung einer neuen Datensatzinstanz durch Kopieren eines vorhandenen Datensatzes, wobei einige Eigenschaften geändert werden, was eine nicht-destruktive Mutation darstellt.
Nicht-destruktive Mutation mit Aufzeichnungen:
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" }
Diese Funktion ist praktisch, wenn man mit unveränderlichen Datenstrukturen arbeitet, da sie eine Möglichkeit bietet, eine Instanz zu "modifizieren", ohne die ursprünglichen Daten zu verändern.
IronPDF ist eine PDF-Bibliothek für .NET-Entwickler, die eine umfassende Lösung zur Erstellung, Bearbeitung und Verwaltung von PDF-Dokumenten direkt in .NET-Anwendungen bietet. Es vereinfacht den PDF-Erzeugungsprozess, indem es Entwicklern ermöglicht HTML konvertierencSS, JavaScript und Bilder in PDFs einfügen. IronPDF unterstützt eine Vielzahl von .NET-Frameworks und Projekttypen, einschließlich Web-, Desktop- und Konsolenanwendungen, für verschiedene Betriebssysteme wie Windows, Linux und macOS.
Neben der PDF-Erstellung bietet IronPDF Funktionen zur Bearbeitung von PDFs, zur Einstellung von Eigenschaften und Sicherheit, zur Arbeit mit PDF-Formularen und zur Extraktion von Inhalten. Es wurde entwickelt, um die Bedürfnisse von Entwicklern zu erfüllen, die ein zuverlässiges Tool zur Integration von PDF-Funktionen in ihre .NET-Projekte suchen.
Die Erstellung einer PDF-Datei in C# mit IronPDF kann sowohl mit Klassen als auch mit Records erfolgen. Nachfolgend finden Sie Beispiele für beide Ansätze zur Erstellung eines einfachen PDF-Dokuments. Der Hauptunterschied zwischen Klassen und Datensätzen in C# liegt in ihrem Verwendungszweck: Klassen sind standardmäßig veränderbar und für die traditionelle objektorientierte Programmierung konzipiert, während Datensätze unveränderlich sind und für die wertbasierte Programmierung konzipiert wurden, was sie ideal für die Datenmodellierung macht.
In diesem Beispiel definieren wir eine Klasse PdfGenerator, die eine Methode zur Erstellung einer PDF-Datei aus einer gegebenen HTML-Zeichenkette enthält.
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
Im Gegensatz dazu ist ein Datensatz in C# nach der Initialisierung unveränderlich. Hier sehen Sie, wie Sie ein ähnliches Ergebnis mit einem Datensatz erreichen können, indem Sie with-Ausdrücke für Änderungen verwenden, die im Wesentlichen eine neue Instanz des Datensatzes mit den gewünschten Änderungen zurückgeben.
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
Diese Beispiele zeigen, wie man mit IronPDF eine PDF-Datei mit einer Klasse und einem Datensatz in C# erzeugt. Die Entscheidung, ob Sie eine Klasse oder einen Datensatz verwenden, hängt von Ihren spezifischen Bedürfnissen ab: Wenn Sie Objekte benötigen, die nach der Erstellung geändert werden sollen, ist eine Klasse möglicherweise besser geeignet. Wenn Sie mit Daten zu tun haben, die sich nach ihrer Erstellung nicht mehr ändern sollen, oder wenn Sie die syntaktische Einfachheit und Sicherheit der Unveränderlichkeit schätzen, könnte ein Datensatz die bessere Wahl sein.
Zusammenfassend lässt sich sagen, dass Klassen traditionelle objektorientierte Funktionen mit veränderbarem Zustand und referenzbasierter Gleichheit bieten, während Records einen modernen Ansatz zur Definition unveränderlicher Datenstrukturen mit wertbasierter Gleichheit darstellen.
Die Entscheidung zwischen der Verwendung einer Klasse oder eines Datensatzes sollte von den spezifischen Anforderungen Ihrer Anwendung geleitet werden, wobei Faktoren wie die Notwendigkeit der Unveränderlichkeit, die Komplexität der Datenstruktur und die bevorzugte Methode des Gleichheitsvergleichs zu berücksichtigen sind. IronPDF bietet eine kostenlos testen für alle, die PDF-Funktionen in ihre .NET-Anwendungen integrieren möchten, mit Lizenzen ab 749 $.
9 .NET API-Produkte für Ihre Bürodokumente