معرفی امکانات جدید 3.0 #C قسمت دوم
  در این مقاله به بررسی چند ویژگی جالب دیگر از 3.0 #C از جمله Partial Methods و Extension Methods و Lambda Expressions می پردازم.
   C#
   ۶۳۹۵۲
   این مقاله حاوی فایل ضمیمه نمی باشد
   مرتضی صحراگرد
   ۱۳۸۷/۵/۷
ارسال لینک صفحه برای دوستان ارسال لینک صفحه برای دوستان  اضافه کردن به علاقه مندیها اضافه کردن به علاقه مندیها   نسخه قابل چاپ نسخه قابل چاپ

 

در صورتی که قسمت اول این مقاله رو مطالعه نکردید به شما توصیه می کنم حتما قسمت اول  را از  اینجا مطالعه نمایید.

در این مقاله به معرفی چند ویژگی جدید دیگر می پردازم و در مقالات بعدی به سراغ LINQ رفته و از دانسته های خود در این مقالات به طور کاربردی استفاده خواهید نمود.

موارد زیر دراین مقاله مورد بررسی قرار خواهند گرفت :

  • Partial Methods
  • Extension Methods
  • Lambda Expressions

Partial Methods :

یکی از ویژگی های جدیدی که در 3.0 #C معرفی شده است متدهای partial هستند. همونطور که مستحضر هستید، یکی از ویژگی هایی که در DotNET 2.0 مرفی شد،کلاس های Partial بودند. این کلاس ها بیشتر مورد استفاده کامپایلر قرار می گرفتند . متدهای partial نیز عملکرد تقریبا مشابهی را دارند. یعنی یک متد را می توانید در قسمتی تعریف نمایید و بدنه آن را خالی بگذارید و در قسمت دیگری پیاده سازی آن را انجام دهید. متدهای Partial نیز معمولا مورد استفاده برنامه هایی از قبیل Code Generator ها قرار می گیرند.

البته متدهای Partial دارای محدودیت هایی از جمله موارد زیر هستند.

  • مقدار برگشتی این متدها باید از نوع void باشد.
  • این متد ها نمی توانند پارامترهایی با ارجاع out داشته باشند ولی می توانند پارامترهایی از نوع ref داشته باشند.
  • این متدها نمی توانند extern باشند.
  • این متدها نمی توانند به صورت virtual تعریف شوند و به طور ضمنی private هستند و نمی توانند سطح دسترسی دیگری داشته باشند.
  • می توانند به صورت static و unsafe باشند.
  • در قطعه کد زیر مثالی در مورد نحوه استفاده از متدهای partial را مشاهده می کنید.


    public partial class MyClass
    {
          // Declaration is here
          partial void HelloWorld();
    }
    public partial class MyClass
    {
          //Implementation is here
          partial void HelloWorld()
          {
             MessageBox.Show("I Am Partial Methode -- 30sharp.com");
          }
    }

    Extension Methods :

    متدهای توسعه گر (Extension Methods) یکی از ویژگیهای بسیار جالب و مهم در 3.0 #C می باشند. در حقیقت با استفاده از این ویژگی قابلیت های زبان LINQ به وجود آمده است.

    با استفاده از متدهای توسعه گر، شما می توانید به کلاس های (به عبارت بهتر به Type های) موجود خود، متدهایی را اضافه کنید. بدون اینکه در خود کلاس کوچکترین تغییری  را به وجود آورید و در حقیقت کلاس خود را توسعه دهید.

    زبان LINQ بیشترین استفاده را از متدهای توسعه گر انجام می دهد که این متدها با نام standard query operators شناخته می شوند.  بخصوص توسعه های زیادی روی Type های زیر انجام شده است.


    IQueryable<T> And IEnumerable<T>

    در مقالات بعدی کاربرد های موارد مطرح شده را در عمل خواهید دید. پس نگران نباشید و به ادامه مقاله بپردازید!

    آموزش این متدها را با یک مثال آغاز می کنم.

    هنگام برنامه نویسی نرم افزار گاهی اوقات نیاز پیدا می کنید که یک ایمیل را اعتبار سنجی کنید. و شاید تمایل داشته باشید که ای کاش کلاس  System.String دارای متدی به نام ValidateEmail بود که یک ایمیل را به عنوان پارامتر گرفته و آن را اعتبار سنجی نموده و نتیجه را به شکل یک متغیر bool بر می گرداند.

    در قعطه کد زیر، من یک متد توسعه گر نوشته ام که این امکان را بوجود آورده است.


    public static class MyExtensions
    {
       public static bool ValidateEmail(this string email)
       {
          Regex exp = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
          return exp.IsMatch(email);

       }
    }

    قبل از اینکه به نحوه استفاده از قطعه کد بالا بپردازم، ذکر چند نکته را ضروری می دانم.

  • همانطور که ملاحظه می کنید، متدهای توسعه گر باید داخل یک کلاس استاتیک نوشته شوند و بدیهی می باشد که خود متد ها نیز باید استاتیک باشند.
  • متدهای توسعه گر در زبان سی شارپ باید نوعی را که می خواهند توسعه دهند را همراه با عبارت this دریافت کنند.
  • نحوه استفاده از این متد توسعه گر را در زیر می بینید.


    string str = "test@yahoo.com";
    bool result= str.ValidateEmail();

    به یاد داشته باشید که اگر کلاسی که متدهای توسعه گر مربوطه را در آن نوشته اید (در اینجا MyExtensions) را در یک فضای نامی خاص مانند MyNameSpace تعریف کرده باشید، هنگامی که قصد دارید در کلاس های دیگر از امکانات این متدها استفاده کنید، باید فضای نامی مربوطه را در بالای صفحه using نمایید.

    همین نکته ای که در بالا ذکر کردم  در برنامه های متوسط و بزرگ می تواند باعث ایجاد مشکل در نگهداری و توسعه شود. لذا پیشنهاد می شود که در حد امکان برای افزودن امکانات جدید به یک Type از خصوصیت توارث (inheritance) استفاده نمایید و متدهای توسعه گر را به عنوان آخرین راه حل در نظر داشته باشید.

    Lambda Expressions :

    تشریح عملکرد عبارات لمبدا (Lambda Expressions) مقداری پیچیده تر از دو ویژگی قبلی است که در این مقاله به معرفی آنها پرداختم. و بنده نیز قصد ندارم این ویژگی را به صورت عمقی به شما معرفی کنم.

    در مقالات بعدی، عملکرد زبان LINQ را تشریح خواهم کرد و شما به طور کاربردی و عملی با این عبارات آشنا شده و فراگیری بهتری خواهید داشت.

    عبارات لمبدا یک روش بسیار خلاصه و مختصر جهت پیاده سازی متد ها می باشند.

    برای معرفی عبارات لمبدا نیز از یک مثال استفاده می کنم.

    به طور کلاسیک در زبان سی شارپ به شکل زیر می توانیم یک Button ایجاد نموده و یک Event Handler را به آن نسبت دهیم.


    void Page_Load()
    {
    Button btn = new Button();
    btn.Click +=
    new EventHandler(btn_Click);
    }
    void btn_Click(object sender, EventArgs e)
    {
    Label1.Text =
    DateTime.Now.ToString();
    }

    با انتشار DotNET 2.0 این امکان به وجود آمد که با استفاده از متدهای ناشناس (anonymous methods) قطعه کد بالا را به صورت خلاصه تر و اصطلاحا inline تعریف کنیم.

    به قطعه کد زیر که عملکرد یکسانی با قطعه کد بالا دارد توجه نمایید. (با استفاده از متدهای ناشناس)


    void Page_Load()
    {
       Button btn = new Button();
       btn.Click +=
    delegate(object sender, EventArgs e)
       {
          Label1.Text =
    DateTime.Now.ToString();
       };
    }

    با استفاده از عبارات لمبدا، قطعه کد برنامه بالا را می توان به صورتی خلاصه تر و زیباتر نوشت. به قطعه کد زیر توجه فرمایید.


    void Page_Init()
    {
       Button btn = new Button();
       btn.Click += (sender, e) => Label1.Text =
    DateTime.Now.ToString();
    }

    عبارت لمبدا در قطعه کد بالا به صورت بولد نمایش داده شده است.

    در قسمت سمت چپ علامت  "<=" پارامترهای ارسال شده به این متد را ملاحظه می کنید و در سمت راست آن بدنه متد قرار دارد.

    همانطور که ملاحظه می کنید در مثال بالا پارامترها را بدون مشخص کردن نوع (Type) آن ها ارسال نموده ایم. نوع این پارامتر ها توسط کامپایلر به صورت ضمنی (implicit) مشخص می شوند.

    اگر تعداد پارامتر های ارسال شده برای متد، یکی باشد نیاز به پرانتز برای آن نیست.

    در حقیقت عملکرد متدهای ناشناس و عبارات لمبدا مشابه می باشند با این تفاوت که عبارات لمبدا دارای انعطاف پذریری بیشتر و خلاصه تر می باشند.

    اجازه بدهید که بیشتر از این در مورد عبارات لمبدا صحبت نکنیم و یادگیری این ویژگی را به مقالات بعدی و هنگام استفاده از LINQ محول نمایید.

    موفق و پیروز باشید.

    مقالات مرتبط :