PDA

View Full Version : سوال: callback اینجا چه کاره هست؟



water_lily_2012
شنبه 10 فروردین 1392, 10:57 صبح
سلام
این چه نوع تابعی هست. ورودی و خروجی چی هست؟؟ callback چه کاری می کنه؟؟

public void GetData(Action<DataItem, Exception> callback)
{
// Use this to connect to the actual data service

var item = new DataItem("Welcome to Mission");
callback(item, null);
}

خواهشاً یکی کامل توضیح بده.
تشکر

Himalaya
شنبه 10 فروردین 1392, 15:56 عصر
سلام

این که callback چیکار میکنه, با این تیکه کد نمیشه در موردش حرف زد. اما اینکه چی هستش، خوب مشخصه که از نوع Action تعریف شده.
اما خود Action. یه نوع خاص از Delegate هستش که داره امضاء مورد نظر رو برای متد ما مشخص میکنه (یعنی متد ما باید چه ورودیها و خروجیهایی داشته باشه.)
متدهایی که برای اکشن معرفی میشن فاقد خروجی هستن و تو dot net 3.5 تا 4 ورودی و تو dot net 4 تا 16 ورودی میتونن داشته باشن.
کدای شما رو نمیشه برسی کرد چون بعضی بخشهای برنامه رو قرار ندادید. مثلا DataItem چیه یا تابعی که به Action معرفی شده چی هستش و اون Exception اصلا چیکارس و ...
اما از رو همین تیکه کد شما یه مثال (فقط در حد مثال هستش و کار خاصی قرار نیست انجام بده) درست کردم ببینیم با هم

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
Action<DataItem, Exception> action = Callback;
Callback(new DataItem("call Callback function without action"), null); // 1
action(new DataItem("call Callback function with action"), null); // 2
GetData(action); // 3
}

private void Callback(DataItem d, Exception ex)
{
MessageBox.Show(d.Message);
}

private void GetData(Action<DataItem, Exception> callback)
{
var item = new DataItem("call Callback function with action from other function");
callback(item, null);
}
}

public class DataItem
{
public string Message { get; set; }
public DataItem(string s)
{
Message = s;
}
}

تابع GetDate شما تو ورودیش یه اکشن میگیره و این اکشن هم داره میگه متدی که به من معرفی میکنید باید فاقد خروجی باشه و ورودیهاش هم اولی از نوع DataItem و دومی از نوع Exception باشه.
قبل از اینکه تابع GetData فراخوانی بشه، قبلش بایدچیزهایی که لازمه برای فراخوانی اون، آماده بشن (یعنی ورودیهاش). پس میریم سراغ آماده کردن این ملزومات
تو click دکمه داریم

Action<DataItem, Exception> action = ؟;
گفتیم Action امضاء متد مورد نظر رو مشخص میکنه. پس سمت راست مساوی باید متدی باشه که از اون امضاء تبعیت کنه. (ورودی و خروجیها). متد Callback امضاء مورد نظر رو داره.
تو خطوط بعد حالتهای فراخوانی متد CallBack آورده شده. حالت اول که مستقیما خود متد رو صدا زدیم و این که حرفی توش نیست.
حالت دوم اومدیم توسط Action تعریف شده، تابع Callback رو صدا زدیم
حاال سوم (که واسه مثال شماس) در اصل همون حالت 2 هستش با این تفاوت که ما action رو دادیم به تابع GetData و عمل فراخوانی تابع Callback داره توسط تابع GetData انجام میشه

حالا چرا وقتی میشه از خود Delegate استفاده کرد، به جاش از Action استفاده کنیم؟ وقتی اسم Delegate میاد قضیه به نظر ترسناک میشه. Action اومده کار رو راحت تر کرده. یعنی شما لازم نیست خودتون delegate تعریف کنید (البته هر جایی هم نمیتونید به جای delegate از Action استفاده کنید. مثلا جایی که متد شما خروجی داشته یاشه، باید برید سراغ یه نوع خاص دیگه از Delegate ها یعنی Func)

اگه بخوایم مثال بالا رو با delegate پیاده کنیم


public partial class Form1 : Form
{
public delegate void MyAction(DataItem d, Exception ex);
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
MyAction action = Callback;
Callback(new DataItem("call Callback function without action"), null); // 1
action(new DataItem("call Callback function with action"), null); // 2
GetData(action); // 3
}

private void Callback(DataItem d, Exception ex)
{
MessageBox.Show(d.Message);
}

private void GetData(MyAction callback)
{
var item = new DataItem("call Callback function with action from other function");
callback(item, null);
}
}

public class DataItem
{
public string Message { get; set; }
public DataItem(string s)
{
Message = s;
}
}

موفق باشید