Putini sunt programatorii de .Net care folosesc (sau mai bine spus au nevoie) sa transmita unei functii ca parametru o alta functie. Pana astazi nici eu nu am avut nevoie, si, probabil, nici de aici inainte nu voi mai avea nevoie (cred). Unde avem nevoie de astfel de lucruri? Hmmm… de exemplu la un interviu pentru un job, unde cei care scriu intrebarile vor sa te puna in dificultate.
Hai sa vedem cum se face asta. Nu poti scrie asa:
public void A() {} public void B(*A) {}
sau alte bazaconii de genul asta.
Pentru a transmite o metoda ca parametru unei alte functii ai nevoie de un delegate, care in c# este un asemanator cu un pointer spre o metoda (in c++).
O metoda care accepta ca parametru alta metoda se scrie cam asa:
static private void SomeFunction(int interval, Delegate method, params object[] p)
{
// some code
}
Vreau asa: SomeFunction va executa o metoda method dupa un interval de timp interval. Eventual, va fi si o lista de parametri, optionali.
Voi defini 2 metode, una cu parametru, alta fara:
static private void SayA()
{
SaySomething("A");
}
static private void SaySomething(object o)
{
MessageBox.Show(o.ToString());
}
si o metoda care sa execute cu delay o alta metoda:
static private void DelayExecute(int interval, Delegate method, params object[] p)
{
Thread.Sleep(interval);
method.DynamicInvoke(p);
}
Exemplu de folosire (functia Main):
delegate void simpleDelegate();
delegate void parametersDelegate(object o);
static void Main(string[] args)
{
simpleDelegate d = new simpleDelegate(SayA);
DelayExecute(100, d, null);
parametersDelegate p = new parametersDelegate(SaySomething);
DelayExecute(1, p, "Delegates with parameters");
}
Bineinteles, avem nevoie de using la System.Windows.Forms si System.Threading.
Codul complet este urmatorul:
using System; using System.Windows.Forms; using System.Threading; namespace DelegateSample { class Program { delegate void simpleDelegate(); delegate void parametersDelegate(object o); static void Main(string[] args) { simpleDelegate d = new simpleDelegate(SayA); DelayExecute(100, d, null); parametersDelegate p = new parametersDelegate(SaySomething); DelayExecute(1, p, "Delegates with parameters"); } static private void SayA() { SaySomething("A"); } static private void SaySomething(object o) { MessageBox.Show(o.ToString()); } static private void DelayExecute(int interval, Delegate method, params object[] p) { Thread.Sleep(interval); method.DynamicInvoke(p); } } }
Happy coding!