IRONSOFTWAREHOME
GELIŞTIRICI GÜNCELLEMELERI

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

Jacob Mellor, Teknoloji Direktörü @ Team Iron
Jacob Mellor
Updated: 28 Temmuz 2025

Ayırt Edilmiş Birleşimler, etik sınıflar veya toplam türler olarak da bilinir, farklı biçimler alabilen, ancak iyi tanımlanmış ve sınırlı olasılıklı veri türünü modellemek için güçlü bir araçtır. C#, bazı diğer diller (örneğin F# veya Rust) gibi yerel ayırt edilmiş birleşimlere sahip olmasa da, dilde birkaç teknik kullanarak ayırt edilmiş birleşimleri simüle edebilirsiniz. Bu eğitimde, ayırt edilmiş birleşimlere dalacağız, C#'ta nasıl uygulanacağını ve IronPDF kütüphanesi ile pratik kullanım durumunu ele alacağız.

Ayırt Edilmiş Birleşim Nedir?

Basit terimlerle, ayırt edilmiş birleşim, önceden tanımlanmış birkaç form veya değeri tutabilen bir türdür. Derleme zamanında yalnızca geçerli durumların ele alındığını garanti ederek, farklı türleri veya değerleri kapsayan tür güvenli bir yapı oluşturma olanağı sağlar.

Bir işlemin sonucunu temsil etmek istediğiniz bir senaryoyu düşünün. İşlem ya başarılı olabilir ve bazı veriler döndürebilir ya da başarısız olabilir ve bir hata mesajı döndürebilir. Ayırt edilmiş birleşim, bu iki olası sonucu tek bir türde temsil etmenizi sağlar.

Example: Simulating Discriminated Union in C#

İşte sınıf yapısını kullanarak C#'ta ayırt edilmiş bir birleşimi nasıl simüle edebileceğinize dair bir örnek:

// 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);
}
C#

Bu örnekte, OperationResult<t>, ayrık birlik türümüzü temsil eden soyut bir sınıftır. Bu, ya tür değeri T olan bir Success ya da bir hata mesajıyla bir Failure olabilir. Özel kurucu, bu tür bir sınıfın örneklerinin yalnızca önceden tanımlanmış durumlar aracılığıyla oluşturulabileceğini garanti eder.

Ayırt Edilmiş Birleşimlerle Desen Eşleme Kullanmak

C#, ayırt edilmiş birleşimlerle iyi çalışan güçlü desen eşleme yetenekleri sağlar. Farklı durumları bir switch ifadesi kullanarak işleyecek 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")
    };

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

Ayırt Edilmiş Birleşimler İçin Genişletme Yöntemleri

Ayırt edilmiş birleşimlerin işlevselliğini genişletme yöntemlerini kullanarak genişletebilirsiniz. Örneğin, sonucun başarı olup olmadığını belirlemek için OperationResult<t> için bir genişletme yöntemi 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;
}

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

Native Support for Discriminated Unions in C#

C#'ın diğer diller gibi ayrım yapıcı birlikler için yerel desteği yoktur, ancak böyle bir özelliğin eklenmesi hakkında toplumda süregelen tartışmalar bulunmaktadır. Yerel ayrım yapıcı birlikler, sınıf hiyerarşilerine güvenmeksizin birlik türlerini tanımlamayı ve bunlarla çalışmayı kolaylaştıracaktır.

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

Ayrım yapıcı birliklerin ana faydalarından biri, sağladıkları tür güvenliğidir. Tüm olası durumlar derleme zamanında bilindiğinden, derleyici tüm durumların ele alındığını zorlayabilir. Bu, daha az çalışma zamanı hatasına yol açar ve kodun daha az hata yapmasına neden olur.

Örneğin, bir anahtar cümlede belirli bir durumu ele almayı unutursanız, derleyici bir hata üretir ve eksik durumu ele almanızı sağlar. Bu özellikle birden fazla olası duruma sahip karmaşık veri yapılarıyla uğraşırken faydalıdır.

Using IronPDF with Discriminated Unions in C#

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

IronPDF, geliştiricilere HTML'den PDF dosyaları oluşturması ve PDF dosyalarını zahmetsizce değiştirmesi için yardımcı olan bir C# PDF kütüphanesidir. C#'da PDF'ler üzerinde çalışırken, IronPDF ile ayrım yapıcı birlikleri entegre ederek PDF dosyaları oluştururken veya işlerken farklı senaryoları ele alabilirsiniz. Örneğin, bir PDF'yi başarıyla oluşturan veya bir hata ile karşılaşan bir işlem olabilir. Ayrım yapıcı birlikler, bu süreci açıkça modellemenize olanak tanır. IronPDF kullanarak bir PDF oluşturduğumuz ve sonucu ayrım yapıcı bir birlik olarak döndürdüğümüz basit bir örnek 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);
        }
    }
}

PdfResult sınıfı, iki duruma sahip bir ayrık birlik temsil eder: Success ve Failure. Success durumu, bir PdfDocument içerirken, Failure durumu bir hata mesajı tutar. GeneratePdf yöntemi bir HTML dizesi alır, IronPDF kullanarak bir PDF oluşturmayı dener ve sonucu bir PdfResult olarak döndürür. Eğer PDF oluşturma başarılı olursa, oluşturulan PDF ile Success durumunu döndürür. Bir istisna oluşursa, hata mesajıyla birlikte Failure durumunu döndürür.

Sonuç

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

C# dillinde ayrım yapıcı birlikler, birden fazla olası duruma sahip verileri modellemenin güçlü ve esnek bir yolunu sunar. C# ayrım yapıcı birlikleri desteklemese de, bunları sınıf hiyerarşileri, desen eşleştirme ve diğer tekniklerle simüle edebilirsiniz. Ortaya çıkan kod daha tür güvenli, daha az hatalı ve daha kolay bakım yapılabilir hale gelir.

IronPDF, yazılıma ön ödeme gerektirmeyen bir ücretsiz deneme sunar. Tüm özellikleri keşfedebilir ve gereksinimlerinize nasıl uyduğunu görebilirsiniz. Denemenizden sonra, lisanslar $999 başlangıç fiyatı ile mevcuttur.

Jacob Mellor, Teknoloji Direktörü @ Team Iron
Teknoloji Direktörü

Jacob Mellor, Iron Software'de Baş Teknoloji Yöneticisidir ve C# PDF teknolojisinde öncü bir mühendisdir. Iron Software'ın ana kod tabanının ilk geliştiricisi olarak, CEO Cameron Rimington ile birlikte şirketin ürün mimarisini 50'den fazla kişilik bir şirkete dönüştürmüştür ve NASA, Tesla ve dünya genelindeki devlet kurumlarına hizmet etmektedir.

...
Daha Fazla Oku

İlgili Makaleler

Key in blue circle

Ücretsiz 30 günlük Deneme Anahtarınızı anında edinin.

Your trial license will be sent to your email address

Herhangi bir sınırlama yoktur. %100 erişim. Kredi kartı gerekmez.

bullet_checkedKredi kartı veya hesap oluşturma gerektirmezHerhangi bir sınırlama yoktur. %100 erişim. Kredi kartı gerekmez.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Ücretsiz Canlı Demo rezervasyonu yapın
Booking Badge

Dünya Çapında Milyonlarca Mühendisin Güvendiği

Iron Software müşteri logoları
Bağımsız Danışmanlık Alın
Aşağıdaki formu doldurun veya sales@ironsoftware.com adresine e-posta gönderin
Bilgileriniz daima gizli kalacaktır.
Dünya Çapında Milyonlarca Mühendisin Güvendiği
Iron Software müşteri logoları
Ücretsiz 30 Günlük Deneme Anahtarınızı anında alın.
Kredi kartı veya hesap oluşturma gerektirmez