delegate etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
delegate etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

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();
  }
}

13 Şubat 2018 Salı

Func Delegate

Giriş
Bu sınıfın kardeşi Action Delegate.

Tanımlama
Şöyle yaparız. İlk parametre girdi tipi. Son parametre ise çıktı tipidir.
Func<int, string>;
Şöyle yaparız. Girdisi olmayan sadece string dönen bir delegate'tir.
Func<string>;
Örnek
Parametre almayan Func için şöyle yaparız.
System.Func<string> f = () =>
{
  ...
  return "...";
};

System.Console.WriteLine(f());
Örnek
Parametre alan Func için şöyle yaparız.
Func<int, int[,]> f = n =>
{
  var r = new int[n, n];
  ...

 return r;
};

f(3);
Örnek
Elimizde bir liste olsun
// A list of delegates that accept an integer and return a string
List<Func<int, string>> delegateList = new List<Func<int, string>>();
Metod eklemek için şöyle yaparız.
public static string Foo(int x)
{
  ...
}
delegateList.Add (Foo); // Add a delegate to a named method
delegate eklemek için şöyle yaparız.
delegateList.Add(delegate(int x) { return $"Bar {x * 2}"; } ); 
lambda eklemek için şöyle yaparız.
delegateList.Add(x => $"Baz {x * 3}"); // Add a delegate to a lambda
Çağırmak için şöyle yaparız.
foreach (var del in delegateList)
{
  Console.WriteLine(del(23));
}
GetInvocationList metodu
Delegate[] döner. Şöyle yaparız.
Func<bool> funcList = null;
funcList += Init;
funcList += Process;
foreach (var func in funcList.GetInvocationList())
{
  var fn = func as Func<bool>;
  bool execuationStatus = fn();
}