4 Nisan 2018 Çarşamba

Action Delegate

Giriş
Şu satırı dahil ederiz.
using System.Action;
Delegate'in açıklaması şöyle.
A Delegate is a neat way to pass a method around as a variable or parameter.
C#'ta hazır gelen Action sınıfı var. Bu sınıfın tanımı şöyle
public delegate void Action();
void dönen, 0 veya n tane parametre alabilen bir delegate tanımıdır. Bu sınıfın kardeşi Func Delegate

Action Delegate en çok callback işleri için kullanlır.

Tanımlama
string parametre alıyorsa şöyle yaparız.
Action<string> a = (str) => {...}
Constructor - Public Method İçin
Şöyle yaparız.
class Handler
{
    public void Add (int value) { ... }
}

var x = new Handler();
Action<int> func1 = x.Add;
Constructor - Static Method İçin
Şöyle yaparız.
static class HandlerExtensions
{
    public static void AddEx(this Handler instance, int value) { ... }
}

Action<Handler, int> func2 = HandlerExtensions.AddEx;
Constructor - Lambda
Örnek
Elimizde şöyle bir metod olsun.
void DoWork(Action callback)
{
  Console.WriteLine("doing work");
  callback();
}
Şöyle yaparız.
DoWork(() => Console.WriteLine("callback called"));
Örnek
Elimizde success ve failure için ayrı ayrı callback'ler çağıran bir metod olsun.
public class MyResult
{
  public Action OnSuccess { set; get; }
  public Action OnError { set; get; }
}

void DoWork(MyResult callback)
{
  Console.WriteLine("doing work");
  callback.OnSuccess();
}
Şöyle yaparız.
DoWork(new MyResult() {
  OnSuccess = () => Console.WriteLine("Success"),
  OnError = ()=>Console.WriteLine("Error") }
);

Method Alanı
Şöyle yaparız.
class Program
{
  private static string _value;
  static void Main(string[] args)
  {
    var t = new Action(() => _value = "foo");
    Console.Out.WriteLine("t.Method.IsStatic: {0}", t.Method.IsStatic);
  } 
}
Diğer
C++ Karşılığı
std::function'a denk geliyor.

Java Karşılığı
Delegate'in karşılığı Java'da tam olarak yok. Şöyle yaparız.
public class Test {
  public static void main(String[] args) throws  Exception {
    new Test().doWork(new Callback() { // implementing class            
      @Override
      public void call() {
        System.out.println("callback called");
      }
    });
  }

  public void doWork(Callback callback) {
    System.out.println("doing work");
    callback.call();
  }

  public interface Callback {
    void call();
  }
}

Hiç yorum yok:

Yorum Gönder