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

C# Generics (Geliştiriciler için Nasıl Çalışır)

C# jenerikleri, yönettikleri veri tipinin bir parametre olarak belirtilebileceği sınıflar, metotlar, arayüzler ve delegeler tasarlamanın bir yolunu tanıtır. Genel tür parametresi olarak bilinen bu kavram, esnek ve yeniden kullanılabilir kod bileşenleri oluşturulmasını sağlar. Genel türleri kullanarak kodun yeniden kullanılabilirliğini, tür güvenliğini ve performansını en üst düzeye çıkarabilirsiniz. Örneğin, bir genel sınıf bir kez tanımlanabilir ancak farklı veri türleriyle başlatılabilir, çok yönlülük ve tür bütünlüğü sunar. Bu makalede, C# Jeneriklerinin Temellerini ve PDF manipulasyonu için IronPDF kütüphanesi özelliklerini öğreneceğiz.

Genel Sınıfların Temelleri

C#'ta bir genel sınıf, içerdiği veya çalıştığı tür için bir şablon oluşturma anlamına gelir. Bu şablon, genellikle T ile gösterilir ve sınıf başlatıldığında belirlenen bir tür parametresini temsil eder. Çeşitli veri türlerini işlemek için tür parametresi T ile genel sınıflar oluşturabiliriz. Genel sınıflar, tüm veri türlerini tutarken tür güvenliğini sağlayan ve tür dönüşümüne olan ihtiyacı azaltan listeler, kuyruklar ve hash tabloları gibi koleksiyon sınıfları için özellikle kullanışlıdır.

Basit Bir Genel Sınıf Örneği

Herhangi bir türden bir değer saklamak üzere tasarlanmış Box adlı genel bir sınıf düşünün:

public class Box<t>
{
    private T data;

    public Box(T data)
    {
        this.data = data;
    }

    public T Data
    {
        get { return data; }
    }
}
public class Box<t>
{
    private T data;

    public Box(T data)
    {
        this.data = data;
    }

    public T Data
    {
        get { return data; }
    }
}
Public Class Box(Of T)
    Private data As T

    Public Sub New(data As T)
        Me.data = data
    End Sub

    Public ReadOnly Property Data As T
        Get
            Return data
        End Get
    End Property
End Class
$vbLabelText   $csharpLabel

Bu sınıfı kullanmak için, T: için gerçek türü belirterek bir örnek oluşturun:

Box<int> integerBox = new Box<int>(123);
Box<string> stringBox = new Box<string>("Hello");
Box<int> integerBox = new Box<int>(123);
Box<string> stringBox = new Box<string>("Hello");
Dim integerBox As New Box(Of Integer)(123)
Dim stringBox As New Box(Of String)("Hello")
$vbLabelText   $csharpLabel

Bu kod, tek bir sınıfın (Box) farklı veri türlerini (int, string) depolayacak şekilde nasıl uyarlanabileceğini göstermektedir, jeneriklerin kod tekrar kullanımı ve tür güvenliği için gücünü sergilemektedir.

Genel Metotların Uygulanması

Genel metotlar, genel sınıflara benzer ancak tür parametreleri metot seviyesinde tanımlanır. Bu, farklı türler üzerinde işlemler yapabilen metotlar oluşturma imkanı sağlar, bu metotların genel olmayan veya genel bir sınıf içerisinde tanımlanmasına olanak tanır.

Genel Metot Örneği

İşte herhangi bir türdeki bir dizideki iki elementi değiştiren bir metod:

public class Utility
{
    // Swaps two elements by reference using generics
    public static void Swap<t>(ref T lhs, ref T rhs)
    {
        T temp = lhs; // Store lhs in a temporary variable
        lhs = rhs;    // Assign rhs to lhs
        rhs = temp;   // Assign temp (original lhs) to rhs
    }
}
public class Utility
{
    // Swaps two elements by reference using generics
    public static void Swap<t>(ref T lhs, ref T rhs)
    {
        T temp = lhs; // Store lhs in a temporary variable
        lhs = rhs;    // Assign rhs to lhs
        rhs = temp;   // Assign temp (original lhs) to rhs
    }
}
Public Class Utility
    ' Swaps two elements by reference using generics
    Public Shared Sub Swap(Of T)(ByRef lhs As T, ByRef rhs As T)
        Dim temp As T = lhs ' Store lhs in a temporary variable
        lhs = rhs ' Assign rhs to lhs
        rhs = temp ' Assign temp (original lhs) to rhs
    End Sub
End Class
$vbLabelText   $csharpLabel

Yukarıdaki metodun kullanımı şu şekilde olabilir:

int a = 1, b = 2;
Utility.Swap<int>(ref a, ref b);

string first = "world", second = "hello";
Utility.Swap(ref first, ref second);
int a = 1, b = 2;
Utility.Swap<int>(ref a, ref b);

string first = "world", second = "hello";
Utility.Swap(ref first, ref second);
Dim a As Integer = 1, b As Integer = 2
Utility.Swap(Of Integer)(a, b)

Dim first As String = "world", second As String = "hello"
Utility.Swap(first, second)
$vbLabelText   $csharpLabel

Genel Arayüzler ve Delegeler Keşfi

Genel arayüzler ve delegeler, her türle çalışabilen sözleşmeler ve geri çağırma metotları tanımlamaya olanak tanır. Sınıfınızda veya metodunuzda genel bir arayüz uygulamak veya genel bir delege kullanmak esnekliği ve kodun yeniden kullanımını artırır.

Genel Arayüz Örneği

Veri erişim işlemleri için bir genel depo arayüzü şu şekilde görünebilir:

public interface IRepository<t>
{
    void Add(T item);
    T GetById(int id);
    IEnumerable<t> GetAll();
}
public interface IRepository<t>
{
    void Add(T item);
    T GetById(int id);
    IEnumerable<t> GetAll();
}
Public Interface IRepository(Of T)
    Sub Add(item As T)
    Function GetById(id As Integer) As T
    Function GetAll() As IEnumerable(Of T)
End Interface
$vbLabelText   $csharpLabel

Bu arayüz, belirli veri türlerini yönetmek için herhangi bir sınıf tarafından uygulanabilir, bu da farklı türlerde tutarlı veri erişim desenleri sağlar.

Genel Delege Örneği

Tür güvenli bir geri çağırmayı tanımlamak için genel bir delege kullanılabilir:

public delegate void Action<t>(T item);
public delegate void Action<t>(T item);
Public Delegate Sub Action(Of T)(item As T)
$vbLabelText   $csharpLabel

Genel Koleksiyonlardan Yararlanma

Genel koleksiyon sınıfları, List, Dictionary<TKey, TValue> ve System.Collections.Generic alanındaki diğerleri gibi, herhangi bir belirli türün verilerini depolamak ve işlemek için tür güvenli, verimli koleksiyonlar sunar. Bu koleksiyonlar, tür dönüşüm ihtiyacını ortadan kaldırdıkları ve çalışma zamanı hatalarını azalttıkları için genel olmayan muadillerine göre üstündür.

List<string> names = new List<string>();
names.Add("Alice");
names.Add("Bob");

Dictionary<int, string> keyValuePairs = new Dictionary<int, string>();
keyValuePairs.Add(1, "One");
keyValuePairs.Add(2, "Two");
List<string> names = new List<string>();
names.Add("Alice");
names.Add("Bob");

Dictionary<int, string> keyValuePairs = new Dictionary<int, string>();
keyValuePairs.Add(1, "One");
keyValuePairs.Add(2, "Two");
Dim names As New List(Of String)()
names.Add("Alice")
names.Add("Bob")

Dim keyValuePairs As New Dictionary(Of Integer, String)()
keyValuePairs.Add(1, "One")
keyValuePairs.Add(2, "Two")
$vbLabelText   $csharpLabel

Özel Genel Türler Oluşturma

Yerleşik genel türleri kullanmanın ötesinde, farklı veri türlerinde ortak olan ancak tür özelinde ele alınması gereken işlemleri kapsüle etmek için kendi özel genel türlerinizi oluşturabilirsiniz. Bu yaklaşım, farklı veri türleriyle birlikte kullanılacak kütüphaneler, çerçeveler veya yardımcı araçlar oluşturmak için özellikle yararlıdır.

Özel Genel Tür Örneği

Bir başarı bayrağı ve isteğe bağlı bir mesajla birlikte işlem sonuçlarını kapsülleyen bir genel Result sınıfını düşünün:

public class Result<t>
{
    public bool Success { get; private set; }
    public T Data { get; private set; }
    public string Message { get; private set; }

    public Result(bool success, T data, string message = "")
    {
        Success = success;
        Data = data;
        Message = message;
    }
}
public class Result<t>
{
    public bool Success { get; private set; }
    public T Data { get; private set; }
    public string Message { get; private set; }

    public Result(bool success, T data, string message = "")
    {
        Success = success;
        Data = data;
        Message = message;
    }
}
Public Class Result(Of T)
    Public ReadOnly Property Success As Boolean
    Public ReadOnly Property Data As T
    Public ReadOnly Property Message As String

    Public Sub New(success As Boolean, data As T, Optional message As String = "")
        Me.Success = success
        Me.Data = data
        Me.Message = message
    End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF: C# PDF Kütüphanesi

IronPDF, .NET geliştiricileri için uygulamalarında PDF belgeleri oluşturmak, düzenlemek ve içeriğini çıkarmak üzere tasarlanmış kapsamlı bir kütüphanedir. IronPDF, HTML'den PDF oluşturma, mevcut PDF'leri düzenleme, PDF'leri görüntülere dönüştürme ve daha fazlasına yardımcı olur. IronPDF'in kendisi jeneriklere dayalı olmasa da, bu kütüphaneyle C# ortamında etkileşim kurmayı anlamak, uygulamanızın belge yönetimi yeteneklerini büyük ölçüde artırabilir.

Kod Örneği: IronPDF ile virtual Anahtar Kelimesini Kullanmak

Jeneriklerin buradaki kullanımının arkasındaki fikir, herhangi bir HTML stringinden bir PDF oluşturabilecek yeniden kullanılabilir bir metod oluşturmaktır. Bu metot jenerik olacak ve bize ihtiyaç duydukça farklı meta verileri veya yapılandırmalar belirtme imkanı tanıyacaktır.

Öncelikle, PDF oluşturma seçeneklerimizi tutacak basit bir genel sınıf tanımlayalım. Gösterim amaçlı bu sınıf basit olacak, ancak ihtiyaçlarınıza göre daha fazla özellik ile genişletebilirsiniz.

public class PdfOptions<t>
{
    public T Metadata { get; set; }
    public string HtmlContent { get; set; }
}
public class PdfOptions<t>
{
    public T Metadata { get; set; }
    public string HtmlContent { get; set; }
}
Public Class PdfOptions(Of T)
    Public Property Metadata As T
    Public Property HtmlContent As String
End Class
$vbLabelText   $csharpLabel

Şimdi, IronPDF kullanarak PDF oluşturacak bir statik metot oluşturalım, PdfOptions sınıfımızdan yararlanarak. Bu metot, jeneriklerin kullanımını eylemde göstermek için bir PdfOptions örneğini parametre olarak alacaktır.

using IronPdf; // Make sure to include the necessary namespace for IronPDF

public static class PdfGenerator
{
    // Generates a PDF from provided HTML content and options
    public static void GeneratePdf<t>(PdfOptions<t> options)
    {
        // Initialize the IronPDF HtmlToPdf renderer
        var renderer = new ChromePdfRenderer();

        // Optional: Apply any renderer options here, for example, setting the paper size
        renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;

        // Generate the PDF from HTML content
        var pdfDocument = renderer.RenderHtmlAsPdf(options.HtmlContent);

        // Optional: Here, you can use options.Metadata in some way, depending on your generic type T
        // For simplicity, we're just printing the metadata to console if it's of type string
        if (options.Metadata is string metadataString)
        {
            Console.WriteLine($"Metadata: {metadataString}");
        }

        // Save the PDF to a file
        var fileName = $"GeneratedPdf_{DateTime.Now.Ticks}.pdf";
        pdfDocument.SaveAs(fileName);
        Console.WriteLine($"PDF generated and saved as {fileName}");
    }
}
using IronPdf; // Make sure to include the necessary namespace for IronPDF

public static class PdfGenerator
{
    // Generates a PDF from provided HTML content and options
    public static void GeneratePdf<t>(PdfOptions<t> options)
    {
        // Initialize the IronPDF HtmlToPdf renderer
        var renderer = new ChromePdfRenderer();

        // Optional: Apply any renderer options here, for example, setting the paper size
        renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;

        // Generate the PDF from HTML content
        var pdfDocument = renderer.RenderHtmlAsPdf(options.HtmlContent);

        // Optional: Here, you can use options.Metadata in some way, depending on your generic type T
        // For simplicity, we're just printing the metadata to console if it's of type string
        if (options.Metadata is string metadataString)
        {
            Console.WriteLine($"Metadata: {metadataString}");
        }

        // Save the PDF to a file
        var fileName = $"GeneratedPdf_{DateTime.Now.Ticks}.pdf";
        pdfDocument.SaveAs(fileName);
        Console.WriteLine($"PDF generated and saved as {fileName}");
    }
}
Imports IronPdf ' Make sure to include the necessary namespace for IronPDF

Public Module PdfGenerator
    ' Generates a PDF from provided HTML content and options
    Public Sub GeneratePdf(Of T)(options As PdfOptions(Of T))
        ' Initialize the IronPDF HtmlToPdf renderer
        Dim renderer As New ChromePdfRenderer()

        ' Optional: Apply any renderer options here, for example, setting the paper size
        renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4

        ' Generate the PDF from HTML content
        Dim pdfDocument = renderer.RenderHtmlAsPdf(options.HtmlContent)

        ' Optional: Here, you can use options.Metadata in some way, depending on your generic type T
        ' For simplicity, we're just printing the metadata to console if it's of type string
        If TypeOf options.Metadata Is String Then
            Dim metadataString As String = CType(options.Metadata, String)
            Console.WriteLine($"Metadata: {metadataString}")
        End If

        ' Save the PDF to a file
        Dim fileName As String = $"GeneratedPdf_{DateTime.Now.Ticks}.pdf"
        pdfDocument.SaveAs(fileName)
        Console.WriteLine($"PDF generated and saved as {fileName}")
    End Sub
End Module
$vbLabelText   $csharpLabel

Son olarak, PdfGenerator sınıfımızı kullanarak bir PDF belgesi oluşturalım. Bu örnekte, Metadata özelliği bir başlık veya bulduğunuz diğer bilgileri içerecek bir string olabilir.

class Program
{
    static void Main(string[] args)
    {
        // Set the license key for IronPDF if needed
        License.LicenseKey = "Your-License-Key-Here";

        // Create PDF options with HTML content and metadata
        var options = new PdfOptions<string>
        {
            HtmlContent = "<h1>Hello, World!</h1><p>This is a test PDF document generated from HTML.</p>",
            Metadata = "Test PDF Title"
        };

        // Generate the PDF using the specified options
        PdfGenerator.GeneratePdf(options);
    }
}
class Program
{
    static void Main(string[] args)
    {
        // Set the license key for IronPDF if needed
        License.LicenseKey = "Your-License-Key-Here";

        // Create PDF options with HTML content and metadata
        var options = new PdfOptions<string>
        {
            HtmlContent = "<h1>Hello, World!</h1><p>This is a test PDF document generated from HTML.</p>",
            Metadata = "Test PDF Title"
        };

        // Generate the PDF using the specified options
        PdfGenerator.GeneratePdf(options);
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Set the license key for IronPDF if needed
		License.LicenseKey = "Your-License-Key-Here"

		' Create PDF options with HTML content and metadata
		Dim options = New PdfOptions(Of String) With {
			.HtmlContent = "<h1>Hello, World!</h1><p>This is a test PDF document generated from HTML.</p>",
			.Metadata = "Test PDF Title"
		}

		' Generate the PDF using the specified options
		PdfGenerator.GeneratePdf(options)
	End Sub
End Class
$vbLabelText   $csharpLabel

Bu örnek, IronPDF'nin C# Jenerikleri ile entegrasyonunun temellerini gösterir, HTML içeriğinden PDF'ler oluşturmak için esnek bir yol sağlar ve jenerik PdfOptions sınıfı aracılığıyla özelleştirilebilir meta veriler veya yapılandırmalar sağlar. Buna, uygulamanız için daha sofistike seçenekler ve render yapılandırmaları ekleyerek genişletebilirsiniz.

C# Jenerikler (Geliştiriciler İçin Nasıl Çalışır): Şekil 1 - IronPDF kullanarak bir HTML dizgisinden PDF belge oluşturmak için jenerikleri kullanan örnek kod çıktısı

Sonuç

C# Jenerikler (Geliştiriciler İçin Nasıl Çalışır): Şekil 2 - IronPDF lisanslama sayfası

C# jenerikleri, yüksek kaliteli, yeniden kullanılabilir ve tür güvenli kodlar geliştirmek için güçlü bir araçtır. Genel sınıfları, metotları, arayüzleri ve delegeleri anlamak ve uygulayarak, daha uyarlanabilir ve daha kolay bakım yapılabilir kod yazabilirsiniz. Jenerikler, çeşitli veri türlerinde kodun yeniden kullanılmasını sağlar ve aynı zamanda derleme zamanı tür denetimini garanti eder, çalışan zamanındaki hataları azaltır ve genel kod kalitesini artırır. IronPDF, PDF kütüphane araçlarının ücretsiz denemesini sunar ve maliyetler $999 ile başlar.

Sıkça Sorulan Sorular

C#'da generics nedir?

C# generics, sınıfları, metodları, arayüzleri ve delegeleri bir tür parametresi ile tasarlamanın bir yolunu getirir. Bu, esnek ve tekrar kullanılabilir, tür güvenliği ve performans iyileştirmesi sağlayan kod bileşenleri oluşturmayı sağlar.

C#'da generik sınıflar nasıl çalışır?

C#'da bir generik sınıf, genellikle T olarak ifade edilen bir tür parametresi kullanır, bu da içerdiği ya da işlem yaptığı tür için bir yer tutucu olarak davranır. Bu, sınıfın çeşitli veri türleriyle türetilebilmesini sağlarken tür güvenliğini korur.

C#'da bir generik sınıf örneği verebilir misiniz?

Evet, basit bir örnek herhangi bir türde değeri depolayan Box sınıfıdır. Box veya Box gibi örnekler oluşturarak aynı sınıfı kullanarak farklı veri türlerini depolayabilirsiniz.

C#'da generik metod nedir?

Bir generik metod, metod seviyesinde tür parametreleri ile tanımlanır ve farklı türler üzerinde işlem yapabilmeyi sağlar. Bir generik ya da generik olmayan sınıfın parçası olabilir, metod tasarımında esnekliği artırır.

C#'da generik arayüzler ve delegeler nasıl kullanılabilir?

Generik arayüzler ve delegeler her türle çalışabilen sözleşmeler ve geri çağırma metodları tanımlamaya olanak tanır, esnekliği ve kodun tekrar kullanılabilirliğini artırır.

C#'da generik koleksiyonlar kullanmanın avantajları nelerdir?

List ve Dictionary gibi genel koleksiyonlar, belirli türler için tür güvenli ve verimli depolama sunarak dönüştürme ihtiyacını ortadan kaldırır ve çalışma zamanı hatalarını azaltır.

C#'da özel generik türler nasıl oluşturabilirim?

Farklı veri türleri arasında ortak olan ancak türüne özgü şekilde ele alınan işlemleri kapsüllemek için özel generik türler oluşturabilirsiniz, bu da kütüphane veya yardımcı araçlar oluşturmak için faydalıdır.

C# generics, .NET'teki PDF oluşturma süreçlerini nasıl iyileştirebilir?

C# jenerikleri, esnek ve yeniden kullanılabilir bileşenler oluşturmak için bir PDF kütüphanesiyle kullanılabilir. Örneğin, bir PdfOptions sınıfı, jeneriklerin PDF görevlerindeki uyarlanabilirliğini göstererek PDF oluşturma seçeneklerini tutmak için kullanılabilir.

Bir PDF kütüphanesi C# generics ile nasıl kullanılabilir?

IronPDF gibi bir PDF kütüphanesi, işlevselliğini artırmak için C# generics'i kullanabilir. Örneğin, HTML'yi PDF'ye dönüştürmek için bir generik metod kullanılabilir, bu da belge oluşturma için esnek bir yaklaşım sunar.

C# generics kullanmanın avantajları nelerdir?

C# generics, farklı veri türleri arasında kodun tekrar kullanılabilmesini sağlar, derleme zamanında tür kontrolünü sağlar, çalışma zamanı hatalarını azaltır ve genel kod kalitesini artırır. Adaptasyon ve sürdürülebilir kod yazmayı mümkün kılar.

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

Daha Fazla Oku

Iron Destek Ekibi

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