اگر با Lambda Expression آشنا باشيد به احتمال فراوان استفاده از آن را به توابع بي نام در برنامه هاي خود ترجيح خواهيد داد. در حقيقت اگر Lambda Expression در همان ابتدا معرفي مي شد، مطمئناگ امروز توابع بي نام وجود نداشتند.

در نگارش تابع بي نام واژه delegate اضافيست چرا كه كامپايلر مي تواند حدث بزند كه شما يك تابع را به يك delegate مربوط ساخته ايد. به سادگي مي توان يك تابع بي نام را به يك Lambda Expression تبديل كرد. براي اينكار كافيست كه واژه delegate را حذف كنيم و عملگر لامبدا (<=) را بين ليست پارامترها و بدنه تابع بي نام جايگزين كنيم همانند زير: MyDel del = delegate(int x) {return x + 1;}; // Anonymous method
MyDel del = (int x) => {return x + 1;}; // Lambda expression

در اين تبديل ساده كه به ظاهر خلاصه و تميز مي باشد تنها واژه delegate حذف شده است. موارد اضافه ديگري نيز وجود دارد كه براي كامپايلر قابل فهم بوده و لذا مي توان آنها را نيز از Lambda Expression حذف نمود. مثلا" كامپايلر مي تواند از نحوه تعريف delegate نوع پارامترهاي delegate را حدث بزند. لذا Lambda Expression اين اجازه را به ما مي دهد كه نوع پارامتر را نيز حذف كنيم. قبل از اينكه به ادامه بحث بپردازيم اين دو تعريف را داشته باشيد:
  • پارامترهايي كه به همراه نوع آنها آورده مي شوند را پارامتر با نوع صريح گويند.
  • پارامترهايي كه بدون نوع آورده مي شوند را پارامتر با نوع ضمني گويند.

اگر delegate تنها داراي يك پارامتر از نوع ضمني باشد در Lambda Expression مي توان علاوه بر حذف نوع پارامتر، پرانتزهاي دور آن را نيز برداشت.

و دست آخر اينكه Lambda Expression اين اجازه را مي دهد كه اگر كد نسبت داده شده به delegate تنها شامل يك حكم يا عبارت برگشتي باشد مي توان واژه return را نيز از آن حذف نمود. مثال زير مراحل توضيح داده فوق را بهتر نشان مي دهد.


MyDel del = delegate(int x) {return x + 1;}; // Anonymous method
MyDel le1 = (int x) => {return x + 1;}; // Lambda expression
MyDel le2 = (x) => {return x + 1;}; // Lambda expression
MyDel le3 = x => {return x + 1;}; // Lambda expression
MyDel le4 = x => x + 1 ; // Lambda Expression

نكاتي در مورد پارامترها در LambdaExpression:

  • پارامترها در LambdaExpression مي بايست از نظر تعداد، نوع و ترتيب قرارگرفتن كاملا" با آنچه در delegate تعيين شده است، يكي باشد.
  • در صورتي كه پارامترهاي delegate بصورت out يا ref تعريف نشده باشند مي توان نوع پارامتر را حذف نمود (توابع ضمني)
  • اگر تنها يك پارامتر ضمني وجود داشته باشد علاوه بر حذف نوع آن مي توان پرانتز آن را نيز حذف كرد.
  • اگر delegate هيچگونه پارامتري نداشته باشد در LambdaExpression بايد حتما" يك پرانتز خالي منظور كرد.


مثال زير در تكميل مطالب فوق آورده شده است.

public class PD_Del
{
public static EventHandler MyEvent;
static void Main(string[] args)
{
// Use a named method to register for the event.
MyEvent += new EventHandler(EventHandlerMethod);
// Use an anonymous delegate to register for the event.
MyEvent += new EventHandler(delegate(object sender, EventArgs eventargs)
{
Console.WriteLine("Anonymous delegate called");
});
// Use a lamda expression to register for the event.
MyEvent += new EventHandler((sender, eventargs) =>
{
Console.WriteLine("Lamda expression called");
});
Console.WriteLine("Raising the event");
MyEvent.Invoke(new object(), new EventArgs());
Console.WriteLine("\nMain method complete. Press Enter.");
Console.ReadLine();
}

static void EventHandlerMethod(object sender, EventArgs args)
{
Console.WriteLine("Named method called");