Altbilgi içeriğine atla
.NET YARDıM

C# Ayrımcı Birlik (Geliştiriciler İçin Nasıl Çalışır)

Ayrık Birlikler, etiketli birlikler veya toplam türler olarak da bilinir, verilerin farklı biçimler alabileceği, ancak iyi tanımlanmış ve sınırlı olası durumlarla modellemek için güçlü bir araçtır. C# bazı diğer diller (örneğin, F# veya Rust) gibi yerel ayrık birliklere sahip olmasa da, dilde birkaç teknik kullanarak ayrık birlikleri simüle edebilirsiniz. Bu öğreticide, ayrık birliklere, onları C#'ta nasıl uygulayacağımıza ve IronPDF kütüphanesi ile pratik bir kullanım durumuna dalacağız.

Ayrık Birlik Nedir?

Basit bir ifadeyle, ayrık birlik, birkaç önceden tanımlanmış biçim veya değerden birini alabilen bir türdür. Geçerli durumların yalnızca ele alınmasını derleme zamanında garanti ederek, farklı türler veya değerler kapsülleyen tür güvenli bir yapı oluşturmanın bir yolunu sağlar.

Bir işlemin sonucunu temsil etmek istediğiniz bir senaryoyu hayal edin. İşlem başarıyla sonuçlanarak some veri döndürebilir veya başarısız olarak bir hata mesajı döndürebilir. Bir ayrık birlik, bu iki olası sonucu tek bir tür içinde temsil etmenize izin verir.

Örnek: C#'ta Ayrımcı Birliği Simüle Etme

İşte bir sınıf yapısı kullanarak C#'da ayrık birliği nasıl simüle edebileceğinizin bir örneği:

// Define an abstract base class representing the operation result.
public abstract class OperationResult<t>
{
    // Private constructor to ensure the class cannot be instantiated directly.
    private OperationResult() { }

    // Nested class representing a successful operation result.
    public sealed class Success : OperationResult<t>
    {
        public T Value { get; }

        public Success(T value) => Value = value;

        public override string ToString() => $"Success: {Value}";
    }

    // Nested class representing a failed operation result.
    public sealed class Failure : OperationResult<t>
    {
        public string Error { get; }

        public Failure(string error) => Error = error;

        public override string ToString() => $"Failure: {Error}";
    }

    // Factory method to create a successful operation result.
    public static OperationResult<t> CreateSuccess(T value) => new Success(value);

    // Factory method to create a failed operation result.
    public static OperationResult<t> CreateFailure(string error) => new Failure(error);
}
// Define an abstract base class representing the operation result.
public abstract class OperationResult<t>
{
    // Private constructor to ensure the class cannot be instantiated directly.
    private OperationResult() { }

    // Nested class representing a successful operation result.
    public sealed class Success : OperationResult<t>
    {
        public T Value { get; }

        public Success(T value) => Value = value;

        public override string ToString() => $"Success: {Value}";
    }

    // Nested class representing a failed operation result.
    public sealed class Failure : OperationResult<t>
    {
        public string Error { get; }

        public Failure(string error) => Error = error;

        public override string ToString() => $"Failure: {Error}";
    }

    // Factory method to create a successful operation result.
    public static OperationResult<t> CreateSuccess(T value) => new Success(value);

    // Factory method to create a failed operation result.
    public static OperationResult<t> CreateFailure(string error) => new Failure(error);
}
Imports System

' Define an abstract base class representing the operation result.
Public MustInherit Class OperationResult(Of T)
    ' Private constructor to ensure the class cannot be instantiated directly.
    Private Sub New()
    End Sub

    ' Nested class representing a successful operation result.
    Public NotInheritable Class Success
        Inherits OperationResult(Of T)

        Public ReadOnly Property Value As T

        Public Sub New(value As T)
            Me.Value = value
        End Sub

        Public Overrides Function ToString() As String
            Return $"Success: {Value}"
        End Function
    End Class

    ' Nested class representing a failed operation result.
    Public NotInheritable Class Failure
        Inherits OperationResult(Of T)

        Public ReadOnly Property Error As String

        Public Sub New([error] As String)
            Me.Error = [error]
        End Sub

        Public Overrides Function ToString() As String
            Return $"Failure: {Error}"
        End Function
    End Class

    ' Factory method to create a successful operation result.
    Public Shared Function CreateSuccess(value As T) As OperationResult(Of T)
        Return New Success(value)
    End Function

    ' Factory method to create a failed operation result.
    Public Shared Function CreateFailure([error] As String) As OperationResult(Of T)
        Return New Failure([error])
    End Function
End Class
$vbLabelText   $csharpLabel

Bu örnekte, OperationResult<t>, ayrımcı birlik türümüzü temsil eden soyut bir sınıftır. Bu, ya Success türünde bir değere sahip olabilir ya da bir hata mesajı içeren Failure olabilir. Özel yapıcı, böyle bir sınıfın örneklerinin yalnızca önceden tanımlanmış durumlar aracılığıyla oluşturulabileceğini garanti eder.

Ayrık Birliklerde Desen Eşleştirme Kullanımı

C#, ayrık birliklerle iyi çalışan güçlü desen eşleştirme yetenekleri sunar. Hadi, farklı durumları bir switch ifadesi kullanarak ele alan bir yöntemle OperationResult<t> örneğimizi genişletelim.

// Method to handle the result using pattern matching.
public string HandleResult(OperationResult<int> result) =>
    result switch
    {
        OperationResult<int>.Success success => $"Operation succeeded with value: {success.Value}",
        OperationResult<int>.Failure failure => $"Operation failed with error: {failure.Error}",
        _ => throw new InvalidOperationException("Unexpected result type")
    };
// Method to handle the result using pattern matching.
public string HandleResult(OperationResult<int> result) =>
    result switch
    {
        OperationResult<int>.Success success => $"Operation succeeded with value: {success.Value}",
        OperationResult<int>.Failure failure => $"Operation failed with error: {failure.Error}",
        _ => throw new InvalidOperationException("Unexpected result type")
    };
' Method to handle the result using pattern matching.
'INSTANT VB TODO TASK: The following 'switch expression' was not converted by Instant VB:
'public string HandleResult(OperationResult<int> result) => result switch
'	{
'		OperationResult<int>.Success success => $"Operation succeeded with value: {success.Value}",
'		OperationResult<int>.Failure failure => $"Operation failed with error: {failure.Error}",
'		_ => throw new InvalidOperationException("Unexpected result type")
'	};
$vbLabelText   $csharpLabel

Buradaki switch ifadesi, OperationResult<int>'nin hem Success hem de Failure durumlarını ele alır. Bu, tüm olası durumların derleme zamanında kapsanmasını sağlayarak tür güvenliği sağlar ve çalışma zamanı hatalarının riskini azaltır.

Ayrımcı Birlikler için Uzantı Yöntemleri

Ayrımcı birliklerin işlevselliğini uzantı yöntemleri kullanarak genişletebilirsiniz. Örneğin, sonucu başarı olup olmadığını belirlemek için OperationResult<t> için bir genişletme metodu oluşturalım:

// Static class to hold extension methods for OperationResult<t>.
public static class OperationResultExtensions
{
    // Extension method to check if the operation result indicates success. 
    public static bool IsSuccess<t>(this OperationResult<t> result) =>
        result is OperationResult<t>.Success;
}
// Static class to hold extension methods for OperationResult<t>.
public static class OperationResultExtensions
{
    // Extension method to check if the operation result indicates success. 
    public static bool IsSuccess<t>(this OperationResult<t> result) =>
        result is OperationResult<t>.Success;
}
' Static class to hold extension methods for OperationResult(Of T).
Public Module OperationResultExtensions

    ' Extension method to check if the operation result indicates success.
    <System.Runtime.CompilerServices.Extension>
    Public Function IsSuccess(Of T)(ByVal result As OperationResult(Of T)) As Boolean
        Return TypeOf result Is OperationResult(Of T).Success
    End Function

End Module
$vbLabelText   $csharpLabel

Bu statik yöntem, sonucun Success durumu örneği olup olmadığını kontrol eder.

C#'ta Ayrımcı Birlikler için Yerel Destek

C# bazı diğer diller gibi ayrımcı birlikler için yerel destek sağlamaz, ancak bu özelliğin eklenmesi konusunda toplulukta devam eden tartışmalar vardır. Yerel ayrımcı birlikler, sınıf hiyerarşisine güvenmeksizin birlik türlerini tanımlamayı ve onlarla çalışmayı kolaylaştırır.

Derleyici Hataları ve Tür Güvenliği

Ayrımcı birliklerin en önemli avantajlarından biri sağladıkları tür güvenliğidir. Tüm olası durumlar derleme zamanında bilindiği için, derleyici tüm durumların ele alındığını zorunlu kılabilir. Bu, daha az çalışma zamanı hatasına yol açar ve kodun hata yapmanıza daha az olanak sağlar.

Örneğin, bir anahtar ifadesinde belirli bir durumu ele almayı unutursanız, derleyici bir hata üretecek ve sizi eksik durumu ele almanız için uyaracaktır. Bu, birden fazla olası duruma sahip karmaşık veri yapıları ile çalışırken özellikle faydalıdır.

C#'ta Ayrımcı Birlikler ile IronPDF Kullanımı

C# Ayrımcı Birlik (Geliştiriciler İçin Nasıl Çalışır): Şekil 1 - IronPDF

IronPDF, geliştiricilerin HTML'den PDF dosyaları oluşturmasına yardımcı olan ve PDF dosyalarını zahmetsizce değiştirmelerine olanak tanıyan bir C# PDF kütüphanesidir. C#'ta PDF'lerle çalışırken, farklı senaryoları yönetmek için ayrımcı birlikleri IronPDF ile entegre edebilirsiniz. Örneğin, bir PDF oluşturma veya bir hata ile karşılaşma süreciniz olabilir. Ayrımcı birlikler bu süreci net bir şekilde modellemenize olanak tanır. Basit bir örnek oluşturarak IronPDF kullanarak bir PDF ürettiğimiz ve sonucu bir ayrımcı birlik olarak döndüğümüz bir senaryo oluşturalım.

// Using directives for necessary namespaces.
using IronPdf;
using System;

// Define an abstract base class representing the PDF generation result.
public abstract class PdfResult
{
    // Private constructor to ensure the class cannot be instantiated directly.
    private PdfResult() { }

    // Nested class representing a successful PDF generation result.
    public sealed class Success : PdfResult
    {
        public PdfDocument Pdf { get; }

        public Success(PdfDocument pdf) => Pdf = pdf;

        public override string ToString() => "PDF generation succeeded";
    }

    // Nested class representing a failed PDF generation result.
    public sealed class Failure : PdfResult
    {
        public string ErrorMessage { get; }

        public Failure(string errorMessage) => ErrorMessage = errorMessage;

        public override string ToString() => $"PDF generation failed: {ErrorMessage}";
    }

    // Factory method to create a successful PDF result.
    public static PdfResult CreateSuccess(PdfDocument pdf) => new Success(pdf);

    // Factory method to create a failed PDF result.
    public static PdfResult CreateFailure(string errorMessage) => new Failure(errorMessage);
}

// Class to generate PDFs using IronPDF.
public class PdfGenerator
{
    // Method to generate a PDF from HTML content and return the result as a PdfResult.
    public PdfResult GeneratePdf(string htmlContent)
    {
        try
        {
            // Create a new ChromePdfRenderer instance.
            var renderer = new ChromePdfRenderer();

            // Attempt to render the HTML content as a PDF.
            var pdf = renderer.RenderHtmlAsPdf(htmlContent);

            // Return a success result with the generated PDF.
            return PdfResult.CreateSuccess(pdf);
        }
        catch (Exception ex)
        {
            // Return a failure result with the error message if an exception occurs.
            return PdfResult.CreateFailure(ex.Message);
        }
    }
}
// Using directives for necessary namespaces.
using IronPdf;
using System;

// Define an abstract base class representing the PDF generation result.
public abstract class PdfResult
{
    // Private constructor to ensure the class cannot be instantiated directly.
    private PdfResult() { }

    // Nested class representing a successful PDF generation result.
    public sealed class Success : PdfResult
    {
        public PdfDocument Pdf { get; }

        public Success(PdfDocument pdf) => Pdf = pdf;

        public override string ToString() => "PDF generation succeeded";
    }

    // Nested class representing a failed PDF generation result.
    public sealed class Failure : PdfResult
    {
        public string ErrorMessage { get; }

        public Failure(string errorMessage) => ErrorMessage = errorMessage;

        public override string ToString() => $"PDF generation failed: {ErrorMessage}";
    }

    // Factory method to create a successful PDF result.
    public static PdfResult CreateSuccess(PdfDocument pdf) => new Success(pdf);

    // Factory method to create a failed PDF result.
    public static PdfResult CreateFailure(string errorMessage) => new Failure(errorMessage);
}

// Class to generate PDFs using IronPDF.
public class PdfGenerator
{
    // Method to generate a PDF from HTML content and return the result as a PdfResult.
    public PdfResult GeneratePdf(string htmlContent)
    {
        try
        {
            // Create a new ChromePdfRenderer instance.
            var renderer = new ChromePdfRenderer();

            // Attempt to render the HTML content as a PDF.
            var pdf = renderer.RenderHtmlAsPdf(htmlContent);

            // Return a success result with the generated PDF.
            return PdfResult.CreateSuccess(pdf);
        }
        catch (Exception ex)
        {
            // Return a failure result with the error message if an exception occurs.
            return PdfResult.CreateFailure(ex.Message);
        }
    }
}
' Using directives for necessary namespaces.
Imports IronPdf
Imports System

' Define an abstract base class representing the PDF generation result.
Public MustInherit Class PdfResult
	' Private constructor to ensure the class cannot be instantiated directly.
	Private Sub New()
	End Sub

	' Nested class representing a successful PDF generation result.
	Public NotInheritable Class Success
		Inherits PdfResult

		Public ReadOnly Property Pdf() As PdfDocument

		Public Sub New(ByVal pdf As PdfDocument)
			Me.Pdf = pdf
		End Sub

		Public Overrides Function ToString() As String
			Return "PDF generation succeeded"
		End Function
	End Class

	' Nested class representing a failed PDF generation result.
	Public NotInheritable Class Failure
		Inherits PdfResult

		Public ReadOnly Property ErrorMessage() As String

		Public Sub New(ByVal errorMessage As String)
			Me.ErrorMessage = errorMessage
		End Sub

		Public Overrides Function ToString() As String
			Return $"PDF generation failed: {ErrorMessage}"
		End Function
	End Class

	' Factory method to create a successful PDF result.
	Public Shared Function CreateSuccess(ByVal pdf As PdfDocument) As PdfResult
		Return New Success(pdf)
	End Function

	' Factory method to create a failed PDF result.
	Public Shared Function CreateFailure(ByVal errorMessage As String) As PdfResult
		Return New Failure(errorMessage)
	End Function
End Class

' Class to generate PDFs using IronPDF.
Public Class PdfGenerator
	' Method to generate a PDF from HTML content and return the result as a PdfResult.
	Public Function GeneratePdf(ByVal htmlContent As String) As PdfResult
		Try
			' Create a new ChromePdfRenderer instance.
			Dim renderer = New ChromePdfRenderer()

			' Attempt to render the HTML content as a PDF.
			Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)

			' Return a success result with the generated PDF.
			Return PdfResult.CreateSuccess(pdf)
		Catch ex As Exception
			' Return a failure result with the error message if an exception occurs.
			Return PdfResult.CreateFailure(ex.Message)
		End Try
	End Function
End Class
$vbLabelText   $csharpLabel

PdfResult sınıfı, iki durumu olan bir ayrımcı birliği temsil eder: Success ve Failure. Success durumu bir PdfDocument içerirken, Failure durumu bir hata mesajını barındırır. GeneratePdf yöntemi bir HTML dizesi alır, IronPDF kullanarak bir PDF oluşturmaya çalışır ve sonucu bir PdfResult olarak döndürür. PDF oluşturma başarılı olursa, oluşturulan PDF ile Success durumunu döndürür. Bir istisna oluşursa, hata mesajı ile Failure durumunu döndürür.

Sonuç

C# Ayrımcı Birlik (Geliştiriciler İçin Nasıl Çalışır): Şekil 2 - Lisanslama

C#'ta ayrımcı birlikler, birden fazla olası duruma sahip verileri modellemek için güçlü ve esnek bir yol sunar. C# ayrımcı birlikleri desteklemese de, bunları sınıf hiyerarşileri, desen eşleştirme ve diğer teknikleri kullanarak simüle edebilirsiniz. Elde edilen kod daha tür güvenli, hata yapmaya daha az meyilli ve bakımını daha kolay hale gelir.

IronPDF, yazılımı herhangi bir ön maliyet olmadan denemeniz için ücretsiz bir deneme sağlar. Tüm özellikleri keşfedebilir ve ihtiyaçlarınızla nasıl örtüştüğünü görebilirsiniz. Denemenizden sonra, lisanslar $799'dan başlayan fiyatlarla mevcuttur.

Sıkça Sorulan Sorular

C#'ta bir discriminated union nasıl oluşturabilirim?

C#'ta bir discriminated union oluşturmak için iç içe geçmiş alt sınıflara sahip soyut bir sınıf tanımlayın. Her alt sınıf, başarı veya hata durumu gibi bir olası durumu temsil eder ve bu durumları yönetmek için desen eşleştirme kullanabilirsiniz.

IronPDF kütüphanesi discriminated unions işlemede nasıl bir rol oynar?

IronPDF kütüphanesi, PDF oluşturma sonuçlarını yönetmek için discriminated unions ile birlikte kullanılabilir. Bu sonuçları discriminated unions olarak modelleyerek, tür güvenliğini sağlayabilir ve meydana gelebilecek hem başarılı PDF oluşturma hem de olası hataları yönetebilirsiniz.

Desen eşleştirme, C#'ta discriminated unions nasıl geliştirir?

Desen eşleştirme, C#'ta discriminated unions'ı geliştirir, geliştiricilere her olası durumu zarif bir şekilde ele alma imkanı verir. Desen eşleştirme ile farklı sonuçları güvenle yönetebilir ve tüm senaryoların derleme zamanında ele alındığından emin olabilirsiniz.

Discriminated unions C#'ta PDF oluşturma için neden faydalıdır?

Discriminated unions C#'ta PDF oluşturma için faydalıdır çünkü başarı ve hata durumlarını ele almanın yapılandırılmış bir yolunu sağlar. Bu yaklaşım, potansiyel problemleri derleme sırasında ele alarak PDF oluşturma sırasında çalışma zamanı hatalarını azaltır.

Discriminated unions C#'ta ek işlevsellik için genişletilebilir mi?

Evet, discriminated unions uzatma yöntemleri ile ek işlevsellikle genişletilebilir. Bu, PDF oluşturmanın başarı durumunu kontrol etme gibi özel davranışlar eklemenize olanak tanır, temel yapıyı değiştirmeden.

C#'ta native destek olmadan discriminated unions simüle etmenin bir yolu var mı?

Evet, C#'ta native destek olmamasına rağmen, sınıf hiyerarşileri kullanılarak discriminated unions simüle edilebilir. Soyut bir temel sınıf, başarı veya başarısızlık durumları gibi farklı olası sonuçları temsil etmek için iç içe sınıflarla kullanılabilir.

C# geliştiricileri, hataları PDF oluşturma sürecinde etkili şekilde nasıl yönetebilir?

C# geliştiricileri, PDF oluşturma sürecinde hataları etkili şekilde yönetmek için ayrılmış birleşimler kullanarak olası sonuçları modelleyebilir. Bu yaklaşım, hataların derleme zamanında ele alınmasını sağlayarak kodun güvenilirliğini ve bakım kolaylığını artırır.

C# projelerinde IronPDF'i ayrılmış birleşimlerle kullanmanın avantajları nelerdir?

C# projelerinde ayrılmış birleşimlerle IronPDF kullanmak, PDF oluşturma sırasında sağlam hata yönetimi avantajı sunar. Bu kombinasyon, başarılı işlemler ile hatalar arasında net bir ayrım yapılmasına olanak tanır ve kod güvenliğini ve güvenilirliğini artırır.

C#'ta ayrılmış birleşimler tür güvenliğine nasıl katkı sağlar?

Ayrılmış birleşimler, C#'ta tüm potansiyel durumların derleme sırasında ele alındığından emin olarak tür güvenliğine katkı sağlar. Bu, çalışma zamanı hatalarının olasılığını azaltır ve kodu daha öngörülebilir ve bakım kolaylığı olan bir hale getirir.

Jacob Mellor, Teknoloji Direktörü @ Team Iron
Chief Technology Officer

Jacob Mellor, Iron Software'in Teknoloji Müdürü ve C# PDF teknolojisinin öncüsü olan vizyoner bir mühendis. Iron Software’in temel kod tabanının ilk geliştiricisi olarak, şirketin ürün mimarisini kuruluşundan bu yana şekillendirdi ve CEO Cameron Rimington ile birlikte NASA, Tesla ve ...

Daha Fazlasını Oku

Iron Destek Ekibi

Haftanın 5 günü, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara