Skip to content

Delegates ve Events

Genel Bakış

Bu bölümde, C#'ta fonksiyon işaretçileri olan delegate'leri ve event mekanizmasını inceleyeceğiz.

Mülakat Soruları ve Cevapları

1. Delegate nedir ve nasıl kullanılır?

Cevap: Delegate: - Fonksiyon işaretçisi - Tip güvenli - Multicast desteği - Lambda expression desteği

Örnek Kod:

// Delegate tanımlama
public delegate void LogDelegate(string message);

// Delegate kullanımı
public class Logger
{
    public void LogToConsole(string message)
    {
        Console.WriteLine(message);
    }

    public void LogToFile(string message)
    {
        File.WriteAllText("log.txt", message);
    }
}

// Kullanım
var logger = new Logger();
LogDelegate logDelegate = logger.LogToConsole;
logDelegate += logger.LogToFile;  // Multicast
logDelegate("Test mesajı");

// Lambda expression
LogDelegate lambdaDelegate = msg => Console.WriteLine($"Lambda: {msg}");
lambdaDelegate("Test");

2. Event nedir ve nasıl kullanılır?

Cevap: Event: - Delegate wrapper - Encapsulation sağlar - Publisher-Subscriber pattern - Thread-safe

Örnek Kod:

// Event tanımlama
public class Button
{
    public event EventHandler Clicked;

    public void Click()
    {
        Clicked?.Invoke(this, EventArgs.Empty);
    }
}

// Event kullanımı
public class Form
{
    private Button _button;

    public Form()
    {
        _button = new Button();
        _button.Clicked += OnButtonClicked;
    }

    private void OnButtonClicked(object sender, EventArgs e)
    {
        Console.WriteLine("Buton tıklandı!");
    }
}

3. Action ve Func delegate'leri nedir?

Cevap: Generic Delegate'ler: - Action: - Void dönüş tipi - 0-16 parametre - Genel amaçlı

  • Func:
  • Generic dönüş tipi
  • 0-16 parametre
  • Son parametre dönüş tipi

Örnek Kod:

// Action kullanımı
Action<string> logAction = message => Console.WriteLine(message);
Action<int, int> sumAction = (a, b) => Console.WriteLine(a + b);

// Func kullanımı
Func<int, int, int> sumFunc = (a, b) => a + b;
Func<string, bool> isValidFunc = s => !string.IsNullOrEmpty(s);

// Kullanım
logAction("Test");
int result = sumFunc(5, 3);
bool valid = isValidFunc("test");

4. Event ve Delegate arasındaki farklar nelerdir?

Cevap: Event vs Delegate: - Event: - Sadece sınıf içinden tetiklenebilir - += ve -= operatörleri - Thread-safe - Encapsulation

  • Delegate:
  • Her yerden tetiklenebilir
  • = operatörü
  • Thread-safe değil
  • Direkt erişim

Örnek Kod:

public class Publisher
{
    // Delegate
    public LogDelegate LogDelegate { get; set; }

    // Event
    public event EventHandler SomethingHappened;

    public void DoSomething()
    {
        // Delegate kullanımı
        LogDelegate?.Invoke("Log mesajı");

        // Event kullanımı
        SomethingHappened?.Invoke(this, EventArgs.Empty);
    }
}

public class Subscriber
{
    public void Subscribe(Publisher publisher)
    {
        // Delegate atama
        publisher.LogDelegate = LogMessage;

        // Event subscription
        publisher.SomethingHappened += OnSomethingHappened;
    }

    private void LogMessage(string message)
    {
        Console.WriteLine(message);
    }

    private void OnSomethingHappened(object sender, EventArgs e)
    {
        Console.WriteLine("Bir şey oldu!");
    }
}

5. Lambda expression nedir ve nasıl kullanılır?

Cevap: Lambda Expression: - Anonim fonksiyon - Delegate kısayolu - Expression/Statement body - Closure desteği

Örnek Kod:

// Expression lambda
Func<int, int> square = x => x * x;

// Statement lambda
Action<string> print = message =>
{
    Console.WriteLine("Başlık");
    Console.WriteLine(message);
};

// Closure örneği
int factor = 2;
Func<int, int> multiplier = n => n * factor;
Console.WriteLine(multiplier(5));  // 10

// LINQ ile kullanım
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);

Best Practices

  1. Event Kullanımı
  2. EventHandler kullanımı
  3. Null kontrolü
  4. Thread safety
  5. Event naming

  6. Delegate Kullanımı

  7. Generic delegate'ler
  8. Lambda expression
  9. Multicast dikkatli kullanım
  10. Memory leak önleme

  11. Performans

  12. Delegate caching
  13. Event invocation optimizasyonu
  14. Lambda expression reuse
  15. Closure dikkatli kullanımı

Kaynaklar