Zum Fußzeileninhalt springen
.NET HILFE

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 int Id { get; set; }
    public string FullName { get; set; }
}
$vbLabelText   $csharpLabel

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, weil sie zwei unterschiedliche Referenzen im Arbeitsspeicher sind.

Datensätze 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);
public record Person(int Id, string FullName);
$vbLabelText   $csharpLabel

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 int Id { get; set; }
    public string Name { get; set; }

    public Product(int id, string name)
    {
        Id = id;
        Name = name;
    }
}
$vbLabelText   $csharpLabel

Record-Implementierung:

public record Product(int Id, string Name);
public record Product(int Id, string Name);
$vbLabelText   $csharpLabel

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:

  1. Klassen verwenden standardmäßig Referenzgleichheit, was bedeutet, dass zwei Instanzen gleich sind, wenn sie auf denselben Speicherort zeigen.

  2. 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: 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

Zwei 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
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

Zwei 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" };
var originalRecord = new Person(1, "Doe");
var modifiedRecord = originalRecord with { Name = "Iron Developer" };
$vbLabelText   $csharpLabel

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-Webseite

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

Ausgabe:

Ausgegebenes PDF aus dem Klassenbeispiel

Verwendung eines Datensatzes

Im Gegensatz dazu ist ein Record in C# nach der Initialisierung unveränderlich. So könnten Sie ein ähnliches Ergebnis mit einem Record erzielen, indem Sie with-Ausdrücke für Änderungen verwenden, die im Wesentlichen eine neue Instanz des Records 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");
    }
}
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

Ausgabe:

Ausgegebenes PDF aus dem Record-Beispiel

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

IronPDF-Lizenzseite

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 $799.

Häufig gestellte Fragen

Was sind die Hauptunterschiede zwischen C#-Klassen und -Records?

C#-Klassen und -Records sind beide Referenztypen, die zur Modellierung und Kapselung von Daten verwendet werden, unterscheiden sich jedoch in der Behandlung von Gleichheit und Unveränderlichkeit. Klassen verwenden Referenzgleichheit, was bedeutet, dass zwei Instanzen als gleich betrachtet werden, wenn sie auf denselben Speicherort verweisen. Auf der anderen Seite verwenden Records Wertgleichheit: zwei Instanzen werden als gleich betrachtet, wenn ihre Eigenschaften die gleichen Werte haben und sind standardmäßig unveränderlich gestaltet.

Wie kann ich entscheiden, ob ich in C# eine Klasse oder ein Record verwenden soll?

Die Wahl zwischen einer Klasse oder einem Record in C# hängt von Ihren spezifischen Anforderungen ab. Verwenden Sie eine Klasse, wenn Sie änderbare Instanzen benötigen oder Daten und Verhaltensweisen in objektorientierter Programmierung kapseln möchten. Entscheiden Sie sich für ein Record, wenn Ihre Struktur einfach und unveränderlich ist und Sie wertbasierte Gleichheit benötigen, wie zum Beispiel bei Datentransferobjekten.

Wie unterstützt die IronPDF-Bibliothek die PDF-Erstellung in .NET?

IronPDF ist eine leistungsstarke PDF-Bibliothek für .NET, die die Erstellung, Bearbeitung und Verwaltung von PDF-Dokumenten vereinfacht. Sie ermöglicht es Entwicklern, HTML, CSS, JavaScript und Bilder in PDFs zu konvertieren und unterstützt verschiedene .NET-Frameworks und Betriebssysteme, was sie zu einem unverzichtbaren Werkzeug für .NET-Entwickler macht.

Kann ich sowohl C# Klassen als auch Records in PDF-Generierungsprojekten verwenden?

Ja, sowohl C#-Klassen als auch -Records können in PDF-Generierungsprojekten verwendet werden. Die Wahl hängt davon ab, ob Sie änderbare oder unveränderliche Datenstrukturen für Ihre Logik benötigen. Zum Beispiel kann IronPDF nahtlos mit beiden Strukturen arbeiten, um PDFs zu erzeugen und zu bearbeiten.

Welche Rolle spielt Unveränderlichkeit in C#-Records?

Unveränderlichkeit ist ein Kernelement von C#-Records. Einmal erstellt, können die Eigenschaften eines Records nicht geändert werden, was den Wertgleichheitssemantiken entspricht. Dieses Design macht Records ideal für Szenarien, in denen Datenkonsistenz und -integrität entscheidend sind, wie zum Beispiel bei Datentransferobjekten.

Wie verbessert IronPDF die PDF-Funktionalitäten für .NET-Anwendungen?

IronPDF verbessert die PDF-Funktionalitäten für .NET-Anwendungen, indem es Funktionen wie HTML-zu-PDF-Konvertierung, PDF-Bearbeitung und Dokumentensicherheit bereitstellt. Es unterstützt das Arbeiten mit Formularen, das Extrahieren von Inhalten und die nahtlose Integration über verschiedene .NET-Umgebungen hinweg, was die Verarbeitung von PDF-Dokumenten vereinfacht.

Was ist der 'with'-Ausdruck im Kontext von C#-Records?

Der 'with'-Ausdruck in C#-Records wird für nicht destruktive Mutation verwendet. Er ermöglicht es Entwicklern, eine neue Record-Instanz zu erstellen, indem sie eine bestehende kopieren, aber mit einigen geänderten Eigenschaften, wobei die ursprünglichen Daten unverändert bleiben.

Warum gelten Records als geeignet für Datentransferobjekte?

Records gelten als geeignet für Datentransferobjekte, weil sie eine prägnante Syntax für die Definition unveränderlicher Strukturen mit wertbasierter Gleichheit bieten. Dies stellt sicher, dass die Datenintegrität gewahrt bleibt und dass Instanzen mit identischen Werten als gleich behandelt werden, was in Datentransferszenarien oft gewünscht wird.

Jacob Mellor, Chief Technology Officer @ Team Iron
Chief Technology Officer

Jacob Mellor ist Chief Technology Officer bei Iron Software und ein visionärer Ingenieur, der führend in der C# PDF-Technologie ist. Als ursprünglicher Entwickler der Iron Software-Kerncodebasis hat er die Produktarchitektur des Unternehmens seit seiner Gründung gestaltet und zusammen mit CEO Cameron Rimington in ein Unternehmen ...

Weiterlesen