سه شنبه ۵ اردیبهشت ۱۳۹۶
 
 
 
کلمه عبور خود را فراموش کرده اید؟
 

 
 
 سیر تکاملی Delegate ها - قسمت سوم، Lambda Expression
.NET C#
تاریخ ثبت:  ۹۰/۷/۲۸
تعداد نمایش:  ۷۱۰۶
  نویسنده: مجید شهاب فر
 
   ۱۸  نفر تا این لحظه به این مقاله امتیاز داده اند.
 
   Bookmark and Share

در دو مقاله قبلی از این سری به معرفی Delegate و توابع بی نام پرداخته شد که آنها را می توانید از طریق لینکهای زیر مطالعه کنید. در این مقاله به ادامه سیر تکاملی delegate ها و معرفی Lambda Expression می پردازیم.

قسمت اول، همه چیز در مورد Delegate ها
قسمت دوم، توابع بی نام

همانطور كه در مقاله قبلي گفته شد C# 2.0 توابع بي نام را معرفي كرد كه اجازه مي دهد تا قطعه كدي را هنگام ايجاد يا اضافه كردن به delegate ها در همان محل به كار ببريم. شكل نوشتن تابع بي نام وريست كه ما بايد اطلاعاتي را به هنگام نوشتن آن وارد كنيم كه براي كامپايلر از قبل شناخته شده است يعني ما اطلاعاتي ا وارد مي كنيم كه هيچ نيازي به نوشتن آنها نيست.به جاي نوشتن اين اطلاعات اضافي، C# 3.0 وي‍‍ژگي جديد Lambda Expression را معرفي كرده است كه نحوه نوشتن تابع بي نام را ساده تر كرده است و كمي از شاخ و برگ اضافي آن را زده است.

اگر با 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");
  }
}

  کیفیت مقاله ارائه شده از نظر شما   
برای دادن رتبه به این مقاله می بایست Login کرده باشید.
  درباره نویسنده
مجید شهاب فر
طراح، برنامه نویس و مدیر PersiaDevelopers.com
همه مقاله های نوشته شده توسط این کاربر (۱۸)
 
  پیام جدید
صفحه ۱ - پیامهای اصلی ۱ تا ۱ از مجموع ۱ پیام اصلی
اولین قبلی بعدی

 عنوان فرستنده تاریخ
 
very good فروزان مهدوی ۱۳۹۱/۸/۱۱
اولین قبلی بعدی

Copyright © 2006 - 2016 All Rights Reserved.
Please direct your questions or comments to