
C# Jenerikler (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(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 ClassBu 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");Dim integerBox As New Box(Of Integer)(123)
Dim stringBox As New Box(Of String)("Hello")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 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 ClassYukarı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);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)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(Of T)
Sub Add(item As T)
Function GetById(id As Integer) As T
Function GetAll() As IEnumerable(Of T)
End InterfaceBu 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 Sub Action(Of T)(item As T)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");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")Ö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(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 ClassIronPDF: 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(Of T)
Public Property Metadata As T
Public Property HtmlContent As String
End ClassŞ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}");
}
}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 ModuleSon 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);
}
}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 ClassBu ö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.

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

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.
İlgili Makaleler


