Zum Fußzeileninhalt springen
.NET HILFE

C# Diskriminierte Vereinigungen (Wie es für Entwickler funktioniert)

Als .NET-Entwickler, der mit der dynamischen PDF-Erstellung arbeitet und IronPDF verwendet, müssen Sie häufig eine Reihe spezifischer Typen darstellen und verwalten – denken Sie an verschiedene Arten von Dokumentdaten, Protokollnachrichten, Benutzerrollen oder Exportoptionen. Hier kommt das Konzept der diskriminierten Union in C# ins Spiel.

Während C# keine native Unterstützung für diskriminierte Unions wie F# oder Rust bietet, können Sie dennoch diskriminierte Unions effektiv simulieren. In diesem Blogbeitrag werden wir darauf eingehen, wie man einen diskriminierten Union-Typ in C# definiert und verwendet, zeigen, wie man ihn mit IronPDF für die reale PDF-Verarbeitung anwendet und die Vorteile dieses Musters erläutert – besonders in Kombination mit Pattern Matching.

Was sind diskriminierte Unions in C&num?

Diskriminierte Unions, auch bekannt als markierte Unions oder Vereinigungstypen, ermöglichen es einer Variablen, einen Wert aus einer begrenzten Menge möglicher Optionen zu halten, wobei jede Option mit einem eindeutigen Fallbezeichner verbunden ist.

In anderen Sprachen wie F# könnte man sie mit dem Schlüsselwort union definieren. C# bietet dieses Feature nicht nativ, aber Entwickler können clevere Kombinationen aus Datensätzen, Klassen und Switch-Ausdrücken verwenden, um sie zu simulieren.

Zum Beispiel:

public abstract record PdfAction;
public record GenerateReport(string ReportName) : PdfAction;
public record LogError(string Message) : PdfAction;
public record ExportToExcel(string FilePath) : PdfAction;
public abstract record PdfAction;
public record GenerateReport(string ReportName) : PdfAction;
public record LogError(string Message) : PdfAction;
public record ExportToExcel(string FilePath) : PdfAction;
Public MustOverride ReadOnly Property PdfAction() As record
public record GenerateReport(String ReportName) : PdfAction
public record LogError(String Message) : PdfAction
public record ExportToExcel(String FilePath) : PdfAction
$vbLabelText   $csharpLabel

Jeder oben gezeigte Datensatz stellt einen einzelnen Fall der Union dar. Der Basis-Typ PdfAction ist der Diskriminator.

Warum diskriminierte Unions in IronPDF-Workflows wichtig sind

Stellen Sie sich vor, Sie erstellen einen PDF-Berichtgenerator mit IronPDF und müssen basierend auf den Eingaben eines Benutzers verschiedene Aktionen ausführen – vielleicht ein PDF generieren, einen Fehler protokollieren oder Daten exportieren.

Die Verwendung von diskriminierten Unions in C# ermöglicht es Ihnen, diese Optionstypen übersichtlich darzustellen, was zu Sicherheit zur Kompilierzeit, weniger Fehlern und klarerer Logik führt.

So verwenden Sie es mit IronPDF:

void HandlePdfAction(PdfAction action)
{
    switch (action)
    {
        case GenerateReport r:
            var pdf = new IronPdf.HtmlToPdf().RenderHtmlAsPdf("<h1>" + r.ReportName + "</h1>");
            pdf.SaveAs(r.ReportName + ".pdf");
            break;
        case LogError e:
            Console.WriteLine("Logging Error: " + e.Message);
            break;
        case ExportToExcel x:
            Console.WriteLine("Exporting to Excel at " + x.FilePath);
            break;
        default:
            throw new NotSupportedException("Unknown action");
    }
}
void HandlePdfAction(PdfAction action)
{
    switch (action)
    {
        case GenerateReport r:
            var pdf = new IronPdf.HtmlToPdf().RenderHtmlAsPdf("<h1>" + r.ReportName + "</h1>");
            pdf.SaveAs(r.ReportName + ".pdf");
            break;
        case LogError e:
            Console.WriteLine("Logging Error: " + e.Message);
            break;
        case ExportToExcel x:
            Console.WriteLine("Exporting to Excel at " + x.FilePath);
            break;
        default:
            throw new NotSupportedException("Unknown action");
    }
}
Private Sub HandlePdfAction(ByVal action As PdfAction)
	Select Case action
'INSTANT VB TODO TASK: The following 'case' pattern variable is not converted by Instant VB:
'ORIGINAL LINE: case GenerateReport r:
		Case GenerateReport r
			Dim pdf = (New IronPdf.HtmlToPdf()).RenderHtmlAsPdf("<h1>" & r.ReportName & "</h1>")
			pdf.SaveAs(r.ReportName & ".pdf")
'INSTANT VB TODO TASK: The following 'case' pattern variable is not converted by Instant VB:
'ORIGINAL LINE: case LogError e:
		Case LogError e
			Console.WriteLine("Logging Error: " & e.Message)
'INSTANT VB TODO TASK: The following 'case' pattern variable is not converted by Instant VB:
'ORIGINAL LINE: case ExportToExcel x:
		Case ExportToExcel x
			Console.WriteLine("Exporting to Excel at " & x.FilePath)
		Case Else
			Throw New NotSupportedException("Unknown action")
	End Select
End Sub
$vbLabelText   $csharpLabel

Dieser Ansatz hält Ihren Code organisiert und robust und macht es Entwicklern einfacher, alle möglichen Optionen an einem Ort zu verstehen.

Simulieren von diskriminierten Unions in C# - Struct vs. Record vs. Class

Obwohl C# das union-Schlüsselwort fehlt, können Sie diskriminierte Unions simulieren, indem Sie verwenden:

  • Records: Ideal für unveränderliche Daten und unterstützt Pattern Matching auf saubere Weise.
  • Klassen: Mehr Flexibilität bei Vererbung und Referenzsemantik.
  • Strukturen: Nützlich für Werttypen, aber weniger flexibel bei Referenztypen oder Vererbung.

Diskriminierte Unions in C# (Wie es für Entwickler funktioniert): Abbildung 1 - Struktur vs. Datensatz vs. Klasse

Wenn Leistung und Speicherauslegung wichtig sind – z. B. bei Hochgeschwindigkeits-PDF-Protokollierung – könnten Sie in Erwägung ziehen, diskriminierte Unionen mit Bedacht zu verwenden:

public interface IAction { }
public readonly struct SaveAction : IAction
{
    public string FileName { get; }
    public SaveAction(string fileName) => FileName = fileName;
}
public interface IAction { }
public readonly struct SaveAction : IAction
{
    public string FileName { get; }
    public SaveAction(string fileName) => FileName = fileName;
}
Public Interface IAction
End Interface
'INSTANT VB WARNING: VB has no equivalent to the C# readonly struct:
'ORIGINAL LINE: public readonly struct SaveAction : IAction
Public Structure SaveAction
	Implements IAction

	Public ReadOnly Property FileName() As String
	Public Sub New(ByVal fileName As String)
		Me.FileName = fileName
	End Sub
End Structure
$vbLabelText   $csharpLabel

Hinweis: Sie verlieren einige Pattern-Matching-Vorteile mit Strukturen, insbesondere wenn Sie auf Switch-Ausdrücke angewiesen sind.

Vorteile der Verwendung von Discriminated Unions in C

Es gibt mehrere entscheidende Vorteile bei der Annahme dieses Softwareentwicklungs-Musters:

  • Kompilierzeitsicherheit: Fehlende Fälle in einem Switch-Ausdruck werden vor der Laufzeit abgefangen.
  • Klarere Logik: Aktionen lassen sich mit benannten Fällen leichter schreiben, kommentieren und begründen.
  • Trennung der Belange: Sie entkoppeln Verhaltensweisen auf Basis von Daten anstatt von Typhierarchien.
  • Einfaches Refactoring: Das Hinzufügen oder Entfernen von Fällen wird unkomplizierter.

In Verbindung mit IronPDF erleichtert dies die Verwaltung von Benutzereingaben, Rendering-Logik oder das Erstellen dynamischer Vorlagen mit unterschiedlichen Wertpipelines.

Wann sollten diskriminierte Unions mit IronPDF verwendet werden

Hier sind einige praktische Szenarien, in denen dieses Muster hervorragend funktioniert:

  • PDF-Generierungs-Workflows: Verschiedene Schritte im Lebenszyklus eines Dokuments (generieren, speichern, per E-Mail versenden).
  • Berechtigungsmodelle: Stellen unterschiedliche Benutzerzugriffsebenen dar.
  • Protokollierungssysteme: Verwenden Sie diskriminierte Union-Typen für Protokollierungsstufen (info, error, debug).
  • Unit-Tests: Testaktionen als Union-Typen definieren, um wartungsfreundliche Logikbäume zu schaffen.
  • Exportoptionen: Ausgabeziele wie PDF, Excel, Word als Vereinigungsinstanzen darstellen.

Diskriminierte Unions in C# (Wie es für Entwickler funktioniert): Abbildung 2 - Häufige Szenarien für diskriminierte Unions in .NET-Anwendungen

Beispiel - Handhabung von PDF-Aktionen aus UI-Events

Angenommen, Sie erfassen UI-Ereignisse und möchten sie mit diskriminierten Unions an IronPDF-Aufgaben weiterleiten:

public abstract record UserAction;
public record GeneratePdf(string HtmlContent, string FileName) : UserAction;
public record ShowMessage(string Text) : UserAction;
public record ExitApplication() : UserAction;
void OnUserEvent(UserAction action)
{
    switch (action)
    {
        case GeneratePdf pdf:
            var renderer = new IronPdf.HtmlToPdf();
            var document = renderer.RenderHtmlAsPdf(pdf.HtmlContent);
            document.SaveAs(pdf.FileName);
            break;
        case ShowMessage msg:
            MessageBox.Show(msg.Text);
            break;
        case ExitApplication:
            Application.Exit();
            break;
    }
}
public abstract record UserAction;
public record GeneratePdf(string HtmlContent, string FileName) : UserAction;
public record ShowMessage(string Text) : UserAction;
public record ExitApplication() : UserAction;
void OnUserEvent(UserAction action)
{
    switch (action)
    {
        case GeneratePdf pdf:
            var renderer = new IronPdf.HtmlToPdf();
            var document = renderer.RenderHtmlAsPdf(pdf.HtmlContent);
            document.SaveAs(pdf.FileName);
            break;
        case ShowMessage msg:
            MessageBox.Show(msg.Text);
            break;
        case ExitApplication:
            Application.Exit();
            break;
    }
}
Public MustOverride ReadOnly Property UserAction() As record
public record GeneratePdf(String HtmlContent, String FileName) : UserAction
public record ShowMessage(String Text) : UserAction
public record ExitApplication() : UserAction
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'void OnUserEvent(UserAction action)
'{
'	switch (action)
'	{
'		case GeneratePdf pdf:
'			var renderer = New IronPdf.HtmlToPdf();
'			var document = renderer.RenderHtmlAsPdf(pdf.HtmlContent);
'			document.SaveAs(pdf.FileName);
'			break;
'		case ShowMessage msg:
'			MessageBox.Show(msg.Text);
'			break;
'		case ExitApplication:
'			Application.@Exit();
'			break;
'	}
'}
$vbLabelText   $csharpLabel

Dies ermöglicht es Ihnen, Ereignisse mit klarer Logik darzustellen und die Abhängigkeit von öffentlichen Objekttypen oder übermäßig dynamischem Handling zu verringern.

Zukunftsausblick - Wird C# jemals native diskriminierte Unions unterstützen?

Es gab bereits einen Vorschlag, native Unterstützung für diskriminierte Unions in C# hinzuzufügen, insbesondere mit der wachsenden Nachfrage nach ausdrucksstärkeren Typsystemen. Während die Sprache noch kein echtes union-Schlüsselwort eingeführt hat, entwickelt sich C# kontinuierlich weiter – indem es Funktionen wie Datensätze, Pattern Matching und Switch-Ausdrücke näher an die volle Funktionalität von diskriminierten Unions bringt.

.NET-Entwickler, die an modernen, funktional-freundlichen Sprachkonstrukten interessiert sind, sollten dieses Thema genau im Auge behalten.

Abschließende Gedanken

Die Verwendung von diskriminierten Unions in C#, auch ohne native Unterstützung, kann erheblich verbessern, wie Sie Logik in IronPDF-Anwendungen strukturieren und darstellen. Durch die Nutzung von Datensätzen, Switch-Ausdrücken und Basisklassen machen Sie Ihren Code lesbarer, wartbarer und widerstandsfähiger gegenüber Fehlern – und gleichzeitig einen deklarativeren und ausdrucksvolleren Umgang mit PDF-bezogenen Aufgaben ermöglichen.

Wenn Sie ein Softwareentwickler sind, der moderne, flexible .NET-Anwendungen erstellt, ist dieses Muster ein unverzichtbares Werkzeug in Ihrem Toolkit.

Testen Sie IronPDF noch heute kostenlos

Bereit, Ihre C#-PDF-Erzeugung auf die nächste Stufe zu heben? Laden Sie IronPDF herunter und beginnen Sie mit einer kostenlosen Testversion. Egal, ob Sie Dokumente aus HTML erstellen, Exporte protokollieren oder Berichte mit diskriminierten Unions automatisieren – IronPDF bietet Ihnen die Leistung und Performance, die Ihre App verdient.

Häufig gestellte Fragen

Wie kann ich diskriminierte Vereinigungen in C# implementieren?

In C# können Sie diskriminierte Vereinigungen simulieren, indem Sie eine Basisklasse und mehrere abgeleitete Klassen definieren, um jeden möglichen Fall darzustellen. Dieser Ansatz, kombiniert mit Mustererkennung, ermöglicht es Ihnen, mehrere verwandte Datentypen effektiv zu verwalten.

Welche Rolle spielt Mustererkennung in diskriminierten Vereinigungen?

Mustererkennung in C# ist entscheidend, wenn man mit diskriminierten Vereinigungen arbeitet, da sie es ermöglicht, jeden Fall der Vereinigung prägnant zu behandeln, die Lesbarkeit des Codes zu verbessern und die Notwendigkeit mehrerer bedingter Anweisungen zu reduzieren.

Wie vergleichen sich diskriminierte Vereinigungen mit Enums in C#?

Während sowohl diskriminierte Vereinigungen als auch Enums Ihnen ermöglichen, eine feste Menge von Optionen zu definieren, bieten diskriminierte Vereinigungen mehr Flexibilität, da sie verschiedene Datentypen enthalten können, während Enums auf benannte Konstanten eines einzigen Datentyps beschränkt sind.

Kann ich die Datenmanipulation mit Iron Software verbessern, während ich diskriminierte Vereinigungen verwende?

Ja, Produkte von Iron Software wie IronPDF können diskriminierte Vereinigungen ergänzen, indem sie erweiterte Datenhandhabungs- und Verarbeitungskapazitäten bieten, was es einfacher macht, verschiedene Datentypen in .NET-Anwendungen zu manipulieren und darzustellen.

Was sind die Vorteile der Verwendung von diskriminierten Vereinigungen in C#?

Diskriminierte Vereinigungen bieten erweiterte Typsicherheit, Klarheit und Wartbarkeit in Ihrem C#-Code, indem sie es Ihnen ermöglichen, einen Typ mit bestimmten möglichen Formen zu definieren und robuste Typprüfungen zu erleichtern und Fehler zu reduzieren.

Wie beeinflusst die Verwendung von diskriminierten Vereinigungen die Lesbarkeit von Code?

Indem sie Entwicklern ermöglichen, mehrere verwandte Datentypen klar zu definieren und zu handhaben, verbessern diskriminierte Vereinigungen die Lesbarkeit des Codes. Mustererkennung vereinfacht den Code weiter, indem sie die Notwendigkeit für komplexe bedingte Logik reduziert.

Welche Bedeutung hat die Verwendung von Klassen zur Simulation von diskriminierten Vereinigungen in C#?

Die Simulation von diskriminierten Vereinigungen mit Klassen in C# beinhaltet die Erstellung einer Basisklasse mit abgeleiteten Klassen für jeden Fall und ermöglicht eine flexible und ausdrucksstarke Möglichkeit, verschiedene verwandte Typen zu modellieren, ähnlich wie in funktionalen Programmiersprachen.

Wie können diskriminierte Vereinigungen das Fehlerhandling in C# verbessern?

Diskriminierte Vereinigungen können das Fehlerhandling verbessern, indem sie eine genauere Typprüfung bieten und eine Mustererkennung ermöglichen, die potenzielle Fehler zur Kompilierzeit erkennen hilft und die Zuverlässigkeit Ihrer Anwendung erhöht.

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

Weiterlesen