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

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

C# programlamada, yeni yönlendirilebilir ve genişletilebilir kod yazabilmek için delegeyi anlamanın önemi büyüktür. Delegeler, dil içinde geri arama, olay işleme ve fonksiyonel programlama yaklaşımlarını uygulama kolaylığı sağlayan güçlü unsurlar olarak hizmet eder. Microsoft'un delege kılavuzu, C# uygulamalarında kullanılacak Delegate örneklerine yönelik kapsamlı bir bakış sunar.

Bu kapsamlı kılavuzda, C# delegelerinin karmaşıklıklarına derinlemesine bir keşif yapacağız, işlevselliklerini, kullanım senaryolarını ve programcıların daha modüler ve ölçeklenebilir kod yazmalarına nasıl olanak sağladığını inceleyeceğiz.

C# Temsilcileri Anlamak: Geri Çağrıların Omurgası

Temelinde, C#'ta bir delege, bir fonksiyon işaretçisi olarak da ifade edilen ve bir veya daha fazla metodu kapsayan tür güvenli bir nesnedir. Delegeler, fonksiyonlara referanslar oluşturma, bunları parametre olarak geçirme, veri yapılarında depolama ve dinamik olarak çağırma yolları sağlar. Bu, delegeleri geri arama mekanizmalarını gerçekleştirmek ve olay odaklı mimarileri uygulamak için vazgeçilmez bir temel yapar.

C# Temsilcilerinin Temel Özellikleri

  1. Tür Güvenliği: Delegeler tür güvenliğidir ve referans verdikleri metodun imzasının, delegenin imzasına uygun olmasını sağlar.
  2. Çoklu Yayın: Delegeler çoklu yayını destekler ve bu sayede birçok metodun tek bir delege örneği içinde birleştirilmesine izin verir. Çağrıldığında, çoklu yayın delegesi içindeki tüm metodlar sırayla çağrılır.
  3. Anonim Metodlar ve Lambda İfadeleri: C# delegeleri, anonim metodlar ve lambda ifadeleri ile sorunsuz bir şekilde entegre olur, metot tanımlarını satır içinde tanımlamak için özlü bir sözdizimi sağlar.

Temel Kullanımı ve Sözdizimi

Delegelerin kullanımı için temel adımlar, delege türü ve parametreleri ile bildirim, örnekleme ve geri arama metotlarını tanımlayarak çağrının yapılmasını içerir. İşte temel bir örnek:

// Delegate declaration
public delegate void MyDelegate(string message);

class Program
{
    static void Main(string[] args)
    {
        // Instantiation
        MyDelegate myDelegate = DisplayMessage;

        // Invocation
        myDelegate("Hello, Delegates!");
    }

    // Method to be referenced
    static void DisplayMessage(string message)
    {
        Console.WriteLine(message);
    }
}
// Delegate declaration
public delegate void MyDelegate(string message);

class Program
{
    static void Main(string[] args)
    {
        // Instantiation
        MyDelegate myDelegate = DisplayMessage;

        // Invocation
        myDelegate("Hello, Delegates!");
    }

    // Method to be referenced
    static void DisplayMessage(string message)
    {
        Console.WriteLine(message);
    }
}
' Delegate declaration
Public Delegate Sub MyDelegate(ByVal message As String)

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Instantiation
		Dim myDelegate As MyDelegate = AddressOf DisplayMessage

		' Invocation
		myDelegate("Hello, Delegates!")
	End Sub

	' Method to be referenced
	Private Shared Sub DisplayMessage(ByVal message As String)
		Console.WriteLine(message)
	End Sub
End Class
$vbLabelText   $csharpLabel

Geri Arama Senaryoları: Esneklik İçin Delegelerden Yararlanma

Delegelerin ana kullanım senaryolarından biri geri aramalar uygulamaktır. Belirli bir olay meydana geldiğinde bir metodun dış bir bileşeni bilgilendirmesi gereken durumları düşünün. Delegeler, temiz ve modüler bir çözüm sunar:

using System;

class Program
{
    static void Main(string[] args)
    {
        EventPublisher publisher = new EventPublisher();
        EventSubscriber subscriber = new EventSubscriber(publisher);

        publisher.SimulateEvent("Test Event");
    }
}

public class EventPublisher
{
    // Declare a delegate type
    public delegate void EventHandler(string eventName);

    // Create an instance of the delegate
    public event EventHandler EventOccurred;

    // Simulate an event
    public void SimulateEvent(string eventName)
    {
        // Invoke the delegate to notify subscribers
        EventOccurred?.Invoke(eventName);
    }
}

public class EventSubscriber
{
    public EventSubscriber(EventPublisher eventPublisher)
    {
        // Subscribe to the event using the delegate
        eventPublisher.EventOccurred += HandleEvent;
    }

    // Method to be invoked when the event occurs
    private void HandleEvent(string eventName)
    {
        Console.WriteLine($"Event handled: {eventName}");
    }
}
using System;

class Program
{
    static void Main(string[] args)
    {
        EventPublisher publisher = new EventPublisher();
        EventSubscriber subscriber = new EventSubscriber(publisher);

        publisher.SimulateEvent("Test Event");
    }
}

public class EventPublisher
{
    // Declare a delegate type
    public delegate void EventHandler(string eventName);

    // Create an instance of the delegate
    public event EventHandler EventOccurred;

    // Simulate an event
    public void SimulateEvent(string eventName)
    {
        // Invoke the delegate to notify subscribers
        EventOccurred?.Invoke(eventName);
    }
}

public class EventSubscriber
{
    public EventSubscriber(EventPublisher eventPublisher)
    {
        // Subscribe to the event using the delegate
        eventPublisher.EventOccurred += HandleEvent;
    }

    // Method to be invoked when the event occurs
    private void HandleEvent(string eventName)
    {
        Console.WriteLine($"Event handled: {eventName}");
    }
}
Imports System

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim publisher As New EventPublisher()
		Dim subscriber As New EventSubscriber(publisher)

		publisher.SimulateEvent("Test Event")
	End Sub
End Class

Public Class EventPublisher
	' Declare a delegate type
	Public Delegate Sub EventHandler(ByVal eventName As String)

	' Create an instance of the delegate
	Public Event EventOccurred As EventHandler

	' Simulate an event
	Public Sub SimulateEvent(ByVal eventName As String)
		' Invoke the delegate to notify subscribers
		RaiseEvent EventOccurred(eventName)
	End Sub
End Class

Public Class EventSubscriber
	Public Sub New(ByVal eventPublisher As EventPublisher)
		' Subscribe to the event using the delegate
		AddHandler eventPublisher.EventOccurred, AddressOf HandleEvent
	End Sub

	' Method to be invoked when the event occurs
	Private Sub HandleEvent(ByVal eventName As String)
		Console.WriteLine($"Event handled: {eventName}")
	End Sub
End Class
$vbLabelText   $csharpLabel

Fonksiyonel Programlama ile Delegeler

Delegeler, C#'ta fonksiyonel programlama kavramlarını benimsemede önemli bir rol oynar. Yüksek dereceli fonksiyonlarla delegeler kullanarak, geliştiriciler fonksiyonları argümanlar olarak geçirebilir, fonksiyonları döndürebilir ve daha özlü ve ifade edici kodlar oluşturabilirler:

public delegate int MyDelegate(int x, int y);

public class Calculator
{
    public int PerformOperation(MyDelegate operation, int operand1, int operand2)
    {
        // Execute the operation method reference through the passed delegate
        return operation(operand1, operand2);
    }
}

// Usage
var calculator = new Calculator();
int result = calculator.PerformOperation((x, y) => x + y, 5, 3); // Adds 5 and 3
Console.WriteLine(result); // Outputs: 8
public delegate int MyDelegate(int x, int y);

public class Calculator
{
    public int PerformOperation(MyDelegate operation, int operand1, int operand2)
    {
        // Execute the operation method reference through the passed delegate
        return operation(operand1, operand2);
    }
}

// Usage
var calculator = new Calculator();
int result = calculator.PerformOperation((x, y) => x + y, 5, 3); // Adds 5 and 3
Console.WriteLine(result); // Outputs: 8
Public Delegate Function MyDelegate(ByVal x As Integer, ByVal y As Integer) As Integer

Public Class Calculator
	Public Function PerformOperation(ByVal operation As MyDelegate, ByVal operand1 As Integer, ByVal operand2 As Integer) As Integer
		' Execute the operation method reference through the passed delegate
		Return operation(operand1, operand2)
	End Function
End Class

' Usage
Private calculator = New Calculator()
Private result As Integer = calculator.PerformOperation(Function(x, y) x + y, 5, 3) ' Adds 5 and 3
Console.WriteLine(result) ' Outputs: 8
$vbLabelText   $csharpLabel

IronPDF'ü Tanıma: Kısa Bir Genel Bakış

C# Delegeler (Geliştiriciler İçin Nasıl Çalışır): Şekil 1 - IronPDF web sayfası

IronPDF'in özellikleri hakkında daha fazla bilgi edinin ve bu özellik zengin kütüphanenin, C# uygulamalarında PDF oluşturma, düzenleme ve etkileşim olanağı sağladığını keşfedin. Sıfırdan PDF oluşturma, HTML'yi PDF'ye dönüştürme veya mevcut PDF'lerden içerik çıkarma gereksiniminiz olsun, IronPDF bu görevleri kolaylaştırmak için kapsamlı bir araç seti sunar. Çok yönlülüğü, çeşitli projeler üzerinde çalışan geliştiriciler için değerli bir varlık haline getirir.

IronPDF Kurulumu: Hızlı Başlangıç

C# projenizde IronPDF kütüphanesini kullanmaya başlamak için IronPDF NuGet paketini kolayca yükleyebilirsiniz. Paket Yöneticisi Konsolunuzda aşağıdaki komutu kullanın:

Install-Package IronPdf

Alternatif olarak, NuGet Paket Yöneticisi'nde "IronPDF" arayabilir ve buradan yükleyebilirsiniz.

C# Delegeler (Geliştiriciler İçin Nasıl Çalışır): Şekil 2 - IronPDF kütüphanesini NuGet Paket Yöneticisi ile yükleme

C#'da Temsilciler: Hızlı Bir Özete

C#'ta, delegeler tür güvenli fonksiyon işaretçileri olarak hizmet eder ve metodların referans verilmesine ve parametre olarak geçirilmesine olanak tanır. Delegeler yukarıda belirtildiği gibi farklı senaryolarda önemli bir rol oynar. Şimdi, soru şu: C# delegeleri IronPDF ortamına nasıl uyum sağlar ve bunları birlikte etkili bir şekilde kullanabilir miyiz?

Delegelerin IronPDF ile Entegrasyonu

1. Belge Olayları İçin Geri Arama Yöntemleri Kullanma

IronPDF ile delegeleri kullanmanın bir yolu, belge olayları için geri arama yöntemleri aracılığıyla olabilir. IronPDF, delegelerle abone olabileceğiniz olaylar sunar, böylece belge oluşturma sürecinin belirli noktalarında özel mantıkları çalıştırabilirsiniz. Örneğin:

using IronPdf;

public delegate string AddPasswordEventHandler(PdfDocument e);

string AddPassword(PdfDocument document)
{
    string password = "";
    if (document.Password == "")
    {
        password = "Iron123";
    }
    return password;
}

PdfDocument document = new PdfDocument("StyledDocument.pdf");
AddPasswordEventHandler handler = AddPassword;
document.Password = handler.Invoke(document); // Subscribe to the event
document.SaveAs("PasswordProtected.pdf");
using IronPdf;

public delegate string AddPasswordEventHandler(PdfDocument e);

string AddPassword(PdfDocument document)
{
    string password = "";
    if (document.Password == "")
    {
        password = "Iron123";
    }
    return password;
}

PdfDocument document = new PdfDocument("StyledDocument.pdf");
AddPasswordEventHandler handler = AddPassword;
document.Password = handler.Invoke(document); // Subscribe to the event
document.SaveAs("PasswordProtected.pdf");
Imports IronPdf

Public Delegate Function AddPasswordEventHandler(ByVal e As PdfDocument) As String

Private Function AddPassword(ByVal document As PdfDocument) As String
	Dim password As String = ""
	If document.Password = "" Then
		password = "Iron123"
	End If
	Return password
End Function

Private document As New PdfDocument("StyledDocument.pdf")
Private handler As AddPasswordEventHandler = AddressOf AddPassword
document.Password = handler.Invoke(document) ' Subscribe to the event
document.SaveAs("PasswordProtected.pdf")
$vbLabelText   $csharpLabel

Bu C# kod parçasında, bir PdfDocument parametre olarak kabul eden ve bir dize döndüren AddPassword adlı bir yöntem tanımlanır. Bu yöntem içinde, password adlı bir dize değişkeni başlatılır ve sağlanan PdfDocument'un Password özelliği üzerinde bir koşullu kontrol gerçekleştirilir. Şifre boş bir dize ise, password değişkenine "Iron123" değerini atayın ve geri döndürün.

Sonraki adımda, "StyledDocument.pdf" dosya adıyla bir PdfDocument örneği oluşturulur. AddPassword yönteminin aynısına sahip bir imza ile AddPasswordEventHandler adlı bir delege ilan edilir. Bu delegasyonun handler adlı örneği AddPassword yöntemine atanır. document örneği ile Invoke yöntemini geçerek delege çağrılır ve döndürülen şifre document'un Password özelliğine atanır.

Son olarak, document üzerinde SaveAs yöntemi çağrılır ve "PasswordProtected.pdf" olarak kaydedilir. Kod, bir PdfDocument için AddPassword içinde belirli koşullara göre dinamik olarak bir şifre belirlemek ve ayarlamak için etkili bir şekilde bir delege kullanır.

2. Dinamik İçerik için Delegeleri Kullanma

Delegeler aynı zamanda PDF belgesine dinamik içerik enjekte etmek için de kullanılabilir. IronPDF, HTML içeriğinin HTML'den PDF oluşturma destekler, ve geliştiriciler, belirli koşullar veya verilere dayalı olarak dinamik olarak HTML üretebilirler:

// Assuming GetDynamicContent is a delegate that generates dynamic HTML content
Func<string> getDynamicContent = () =>
{
    // Custom logic to generate dynamic content
    return "<p>This is dynamic content based on some condition.</p>";
};

// Incorporate dynamic HTML into the PDF
var pdfRenderer = new ChromePdfRenderer();
var pdfDocument = pdfRenderer.RenderHtmlAsPdf($"<html><body>{getDynamicContent()}</body></html>");
pdfDocument.SaveAs("DynamicContentDocument.pdf");
// Assuming GetDynamicContent is a delegate that generates dynamic HTML content
Func<string> getDynamicContent = () =>
{
    // Custom logic to generate dynamic content
    return "<p>This is dynamic content based on some condition.</p>";
};

// Incorporate dynamic HTML into the PDF
var pdfRenderer = new ChromePdfRenderer();
var pdfDocument = pdfRenderer.RenderHtmlAsPdf($"<html><body>{getDynamicContent()}</body></html>");
pdfDocument.SaveAs("DynamicContentDocument.pdf");
' Assuming GetDynamicContent is a delegate that generates dynamic HTML content
Dim getDynamicContent As Func(Of String) = Function()
	' Custom logic to generate dynamic content
	Return "<p>This is dynamic content based on some condition.</p>"
End Function

' Incorporate dynamic HTML into the PDF
Dim pdfRenderer = New ChromePdfRenderer()
Dim pdfDocument = pdfRenderer.RenderHtmlAsPdf($"<html><body>{getDynamicContent()}</body></html>")
pdfDocument.SaveAs("DynamicContentDocument.pdf")
$vbLabelText   $csharpLabel

Bu örnekte, getDynamicContent delegesi, dinamik olarak HTML içeriği üretir ve bu içerik daha sonra PDF belgesine gömülür.

C# Delegeler (Geliştiriciler İçin Nasıl Çalışır): Şekil 3 - Önceki koddan çıktı PDF

IronPDF'i verimli ve etkili kullanmak için, lütfen IronPDF dökümantasyonunu ziyaret edin.

Sonuç

Sonuç olarak, C# delegeleri, kod esnekliği ve modülerliğinin belkemiğidir. Geri çağrılar uygulamaya, olayları ele almaya ve functional programlama yaklaşımlarını benimsemeye olanak tanırlar, örneğin metod çağrılarını programatik olarak değiştirme yeteneği. C# araç setinde çok yönlü bir araç olarak, delegeler geliştiricilere daha bakımı kolay, ölçeklenebilir ve ifade edici kodlar oluşturmada yetki sağlar. İster olay odaklı uygulamalar inşa ediyor, ister geri arama mekanizmalarını uyguluyor, ister işlevsel programlamayı keşfediyor olun, C# delegeleri, programlama yolculuğunuzda güçlü bir müttefiktir.

C# delegeleri ve IronPDF, uygulamalarınızdaki belge oluşturma olanaklarını geliştiren işbirlikçi bir çift oluşturabilir. İster belge olaylarını özelleştiriyor, ister dinamik içerik enjekte ediyor olun, delegeler IronPDF'in işlevselliğini genişletmek için esnek bir mekanizma sağlar. Olasılıkları keşfederken, projenizin belirli gereksinimlerini dikkate alın ve delegelerin IronPDF ile daha kişiselleştirilmiş ve dinamik bir PDF oluşturma sürecine nasıl katkıda bulunabileceğini düşünün.

IronPDF, tam işlevselliğini denemek için bir ücretsiz deneme sunar. Ticari kullanım için lisanslanabilir ve $999 ile başlayabilir.

Sıkça Sorulan Sorular

C# delegeleri nelerdir ve neden önemlidirler?

C# delegeleri, metoda güvenli işaretçiler olarak, metodların parametre olarak geçirilmesine ve dinamik olarak çağrılmasına izin verirler. Olay işleme, geri çağırmalar ve fonksiyonel programlama paradigmalarını etkinleştirerek esnek, modüler ve ölçeklenebilir kod yazmak için çok önemlidirler.

C#’ta PDF oluşturma için delegeler nasıl kullanılabilir?

Delegeler, belge olayları için geri çağırmaları etkinleştirerek ve PDF'lere dinamik içerikler enjekte ederek PDF oluşturmayı iyileştirebilir. Örneğin, delegeler, belge olaylarına abone olabilir veya IronPDF kullanarak PDF'ler içinde dinamik HTML içeriklerinin oluşturulmasını kolaylaştırabilir.

C#’ta olay odaklı programlamada delegelerin rolü nedir?

Olay odaklı programlamada delegeler, belirli olaylara yanıt verebilecek olay işleyicileri oluşturmayı mümkün kılar, olaylar meydana geldiğinde harici bileşenleri bilgilendirmek için temiz ve modüler bir geri çağırma mekanizması sağlarlar.

C#’ta çoklu gönderme delegeleri nasıl çalışır?

C#’ta çoklu gönderme delegeleri, birden fazla metodu tek bir delege örneğinde birleştirmeye izin verir. Bu, delegedeki tüm metodların ardışık olarak çağrılmasına olanak tanır ve karmaşık olay işleme senaryolarını kolaylaştırır.

C# delegeleri lambda ifadeleri ile kullanılabilir mi?

Evet, C# delegeleri lambda ifadeleri ile kullanılabilir, metod gövdelerinin satır içi tanımlanmasına olanak tanıyan özlü bir yol sağlar. Bu, kodun okunabilirliğini ve esnekliğini artırır, delegelere metodların kolay atanmasına olanak tanır.

C#’ta bir delege nasıl ilan edilir ve kullanılır?

C#’ta bir delege kullanmak için, bir delege türünü ilan edin, bir metod referansı ile örnekleyin ve referans verilen metodları çalıştırmak için onu çağırın. Bu süreç, esnek metod çağrımı ve dinamik kod yürütmeyi sağlar.

Geliştiriciler, belge oluşturma için C# projelerine PDF kütüphanelerini nasıl entegre edebilir?

Geliştiriciler, Paket Yöneticisi Konsolu veya NuGet Paket Yöneticisi aracılığıyla uygun NuGet paketini yükleyerek PDF kütüphanelerini entegre edebilir. IronPDF gibi kütüphaneler PDF oluşturma ve manipülasyonu için sağlam çözümler sunar.

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