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

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

C# programlamasında, delege kavramını anlamak, esnek ve genişletilebilir kod yazmak için son derece önemlidir. Delege, geri çağırmaların, olay işleme ve dil içindeki fonksiyonel programlama paradigmaların uygulamalarını kolaylaştıran güçlü birimler olarak hizmet eder. Microsoft'un delege kılavuzu, C# uygulamalarında kullanılacak Delege örneklerine ilişkin kapsamlı bir genel bakış sunar.

Bu kapsamlı kılavuzda, C# delegelerini karmaşıklıklarına inerek, işlevlerini, kullanım alanlarını ve geliştiricilere daha modüler ve ölçeklenebilir kod yazma konusunda nasıl güç verdiklerini inceleyeceğiz.

C# Delegelerini Anlamak: Geri Çağırmaların Belkemiği

Temelde, C#'ta bir delege tip güvenli nesnedir ve bir fonksiyon işaretçisi olarak da adlandırılan, bir yöntemi veya birden fazla yöntemi kapsüller. Delegeler, fonksiyonlara referanslar oluşturmayı sağlar, yöntemleri parametre olarak iletmek, veri yapılarında depolamak ve dinamik olarak çağırmak için bir araç sunar. Bu, geri çağırma mekanizmalarını elde etme ve etkinlik tabanlı mimarilerin uygulanmasında köşe taşı yapar.

C# Delegelerinin Temel Özellikleri

  1. Tip Güvenliği: Delegeler, referans verdikleri yöntem imzasının, delege imzasıyla uyumlu olduğundan emin olunarak tip güvenliğini sağlar.
  2. Çok Yönlülük: Delegeler çoklu çağrım desteği sağlar, birçok yöntemin tek bir delege örneğine birleştirilmesine izin verir. Çağrıldığında, çoklu çağrım delege içindeki tüm yöntemler sırasıyla çağrılır.
  3. Anonim Yöntemler ve Lambda İfadeleri: C# içindeki delegeler, anonim yöntemler ve lambda ifadeleri ile naif bir şekilde entegre olup, satırlık method tanımları için kısa bir söz dizimi sağlar.

Temel Kullanım ve Sözdizimi

Delegeleri kullanmak için temel adımlar, delege tipiyle ve parametrelerle bildirim, örnekleme ve geri çağırma yöntemlerini tanımlayarak çağırımdır. İşte basit 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 Çağırma Senaryoları: Esneklik İçin Delegeleri Kullanın

Delegelerden biri temel kullanım durumu geri çağırmaları uygulamaktır. Belirli bir olayın gerçekleştiğinde dış bileşeni bilgilendirmesi gereken bir yöntem senaryolarını göz önünde bulundurun. 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ı kucaklamak için kritik bir rol oynar. Daha ifade edici ve özlü kod oluşturmak için fonkiyonları argüman olarak iletmek, fonksiyonlar döndürmek ve üst düzey fonksiyonlarla delegeleri kullanarak:

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ıtımı: Kısa Bir Genel Bakış

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

IronPDF'ün özelliklerini C# uygulamalarında PDF oluşturma, manipülasyonu ve etkileşimini kolaylaştırmak amacıyla tasarlanmış zengin özellikli bir kütüphane olarak öğrenin. İster sıfırdan PDF oluşturmanız, ister HTML'yi PDF'ye dönüştürmeniz ya da mevcut PDF'lerden içerik çıkarmanız gerekse de, 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ıç

Projenizde IronPDF kütüphanesinden yararlanmaya başlamak için IronPDF NuGet paketini kolayca yükleyebilirsiniz. Paket Yöneticisi Konsolunda aşağıdaki komutu kullanın:

Install-Package IronPdf

Alternatif olarak, NuGet Paket Yöneticisi'nde "IronPDF" aratarak oradan yükleyebilirsiniz.

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

C#'ta Delegeler: Hızlı Bir Özet

C#'ta delegeler, tür güvenli fonksiyon işaretçileri olarak görev yapar, yöntemlerin referans alınmasına ve parametre olarak aktarılmasına izin verir. Delegeler, yukarıda bahsedildiği gibi farklı senaryolarda hayati bir rol oynar. Şimdi soru şu: C# delegeleri, IronPDF ortamına nasıl uyar ve etkili bir şekilde kullanılabilir mi?

Delegelerin IronPDF ile Entegrasyonu

1. Belge Olayları için Geri Çağırma Yöntemlerini Kullanma

IronPDF ile delegeleri kullanmanın bir yolu belge olayları için geri çağırma yöntemleridir. IronPDF, delegeler kullanılarak abone olabileceğiniz olaylar sağlar, böylelikle belgenin oluşturulma sürecinde belirli noktalarda özel mantığı gerçekleştirebilirsiniz. Ö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, PdfDocument'yi bir parametre olarak kabul edip bir dize döndüren AddPassword adında bir yöntem tanımlanmıştır. Bu yöntemin içinde, password adında bir dize değişkeni başlatılır ve sağlanan PdfDocument'nin Password özelliği üzerinde bir koşullu kontrol gerçekleştirilir. Parola boş bir dize ise, password değişkenine "Iron123" değeri atanır ve döndürülür.

Sonraki adımda, "StyledDocument.pdf" adlı dosya adı ile bir PdfDocument örneği oluşturulur. AddPasswordEventHandler adında bir temsilci, AddPassword yöntemi ile aynı imzaya sahip olacak şekilde bildirilir. Bu temsilcinin bir örneği olan handler, AddPassword yöntemine atanır. Daha sonra temsilci, document örneğini geçirerek Invoke yöntemi ile çağrılır ve döndürülen parola, document'nin 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 uygun koşullar çerçevesinde parolayı dinamik olarak belirlemek ve ayarlamak için etkili bir şekilde bir temsilci kullanır.

2. Dinamik İçerik İçin Delegeleri Kullanma

Delegeler ayrıca PDF belgesine dinamik içerik enjekte etmek için de kullanılabilir. IronPDF HTML'den PDF oluşturma için HTML içeriği eklemeyi destekler ve geliştiriciler, belirli koşullara veya verilere dayalı olarak dinamik olarak HTML oluşturmak için delegeleri kullanabilirler:

// 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 temsilcisi, dinamik olarak HTML içerik oluşturur ve bu içerik ardından PDF belgesine gömülür.

C# Temsilcileri (Geliştiriciler için Nasıl Çalışır): Şekil 3 - Önceki koddan elde edilen PDF

IronPDF'ü etkin ve verimli bir şekilde kullanmak için lütfen IronPDF dökümantasyonunu ziyaret edin.

Sonuç

Sonuç olarak, C# delegeleri kod esnekliğinin ve modülaritesinin temel taşlarıdır. Geliştiricilerin geri çağırmaları uygulamalarına, olayları ele almalarına ve yöntem çağrılarını programatik olarak değiştirme yeteneği gibi işlevsel programlama paradigmalarını benimsemelerine olanak tanırlar. C# araç setinde çok yönlü bir araç olarak delegeler, geliştiricilerin daha bakımı kolay, ölçeklenebilir ve ifade edici kodlar oluşturmalarını sağlar. İster olay odaklı uygulamalar oluşturuyor, ister geri çağırma mekanizmalarını uyguluyor olun, 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 yeteneklerini artırarak birlikte çalışan bir ikili oluşturabilir. İster belge olaylarını özelleştiriyor, ister dinamik içerik enjekte ediyor olun, delegeler IronPDF'ün işlevselliğini genişletmek için esnek bir mekanizma sağlar. Fırsatları keşfederken, projenizin belirli gereksinimlerini ve delegelerin IronPDF ile daha özel ve dinamik bir PDF oluşturma sürecine nasıl katkıda bulunabileceğini göz önünde bulundurun.

IronPDF, tam işlevselliğini test etmek için ücretsiz deneme imkanı sunar. ticari kullanım için lisanse edilebilir, $799'den itibaren.

Sıkça Sorulan Sorular

C# delege yapı nedir ve neden önemlidir?

C# delege yapıları, yöntemlere tür güvenli işaretçilerdir, yöntemlerin parametre olarak iletilmesine ve dinamik olarak çağrılmasına olanak tanır. Olay işleme, geri çağrı mekanizmaları ve fonksiyonel programlama yapıları oluşturarak esnek, modüler ve ölçeklenebilir kod yazımı için çok önemlidir.

Delege yapıları C#'da PDF oluşturma için nasıl kullanılabilir?

Delege yapıları, belge olayları için geri çağrı mekanizmaları etkinleştirerek ve PDF'lere dinamik içerik ekleyerek PDF oluşturmayı geliştirebilir. Örneğin, delege yapıları belge olaylarına abone olabilir veya IronPDF kullanarak PDF'lerde dinamik HTML içeriği oluşturabilir.

C#'da olay odaklı programlamada delegelerin rolü nedir?

Olay odaklı programlamada delege yapıları, belirli olaylara yanıt veren olay işleyicileri oluşturulmasını sağlar, olaylar meydana geldiğinde harici bileşenleri bilgilendirmek için temiz ve modüler bir geri çağrı mekanizması sunar.

C#'da çoklu yayın delege yapıları nasıl çalışır?

C#'da çoklu yayın delege yapıları, birden fazla yöntemi tek bir delege yapısı örneğinde toplar. Bu, delege yapısındaki tüm yöntemlerin sırayla çağrılmasını sağlayarak karmaşık olay işleme senaryolarına olanak tanır.

C# delege yapıları lambda ifadeleriyle kullanılabilir mi?

Evet, C# delege yapıları lambda ifadeleriyle kullanılabilir, bu da satır içi yöntem gövdeleri tanımlamanın kısa bir yolunu sunar. Bu, kodun okunabilirliğini ve esnekliğini artırır, yöntemlerin delege yapılarına kolayca atanmasına olanak tanır.

C#'da bir delege yapısı nasıl ilan edilir ve kullanılır?

C#'da bir delege yapısını kullanmak için, bir delege türü ilan edin, bir yöntem referansıyla örnekleyin ve referans gösterilen yöntemleri yürütmek için çağırın. Bu süreç, esnek yöntem çağrısını ve dinamik kod yürütmesini mümkün kı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 değiştirme için sağlam çözümler sunar.

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